| 题目 | 难度 | 知识点 |
|---|---|---|
| A 曹髦 | ★ | 签到 |
| B 沙摩柯 | ★ | 签到 |
| C 戏志才 | ★ | 签到 |
| D 神孙权 | ★★ | 前后缀 |
曹髦
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],ans[N],n;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],ans[i]=a[i]-1;
ans[1]+=2;
for(int i=1;i<=n;i++) cout<<min(ans[i],5)<<" ";
return 0;
}
沙摩柯
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int a[N],n;
map<int,int>mp;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
long long int ans=0;
for(int i=1;i<=n;i++)
{
if(a[i]<=n&&mp[a[i]]==0) ans+=a[i];
mp[a[i]]++;
}
cout<<ans;
return 0;
}
戏志才
找环,且x在环上。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int a[N],st[N],n,x;
void solve()
{
cin>>n>>x;
int w=x;
for(int i=1;i<=n;i++) cin>>a[i];
int flag=0;
while(1)
{
if(st[x])
{
if(x==w) flag=1;
break;
}
st[x]=1,x=a[x];
}
if(flag) puts("Yes");
else puts("No");
}
int main(void)
{
solve();
return 0;
}
神孙权
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL a[N],s[N],n,k,len,l[N],r[N];
int main(void)
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
LL temp=k;
for(int i=0;i<=n;i++)
{
if(temp-i<0)
{
break;
}
temp+=1,temp-=i;
len++;
}
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
for(int i=1;i<=n;i++) l[i]=max(l[i-1],s[i]);
for(int i=n;i>=1;i--) r[i]=max(r[i+1],s[n]-s[i-1]);
LL ans=0;
len=min(len,n);
for(int i=0;i<=len;i++)//前面最多摸多少牌
{
int cnt=len-i;//后面最多摸多少牌
ans=max({ans,l[i]+r[n-cnt+1]});//前边不超过摸牌次数的最大前缀+后边不超过摸牌次数的最大后缀。
}
cout<<ans;
return 0;
}