牛客周赛142
D题
想到了暴力让每个i作为起始点向后操作,其实一个i就两种选择,前边选择会直接影响后边,只需要考虑a1做出两种选择暴力即可,忽略了首位决定性作用,代码没怎么精简
const int N=200010;
int a[N],b[N];
void solve()
{
int n,i,j,sum=0;
cin >> n;
for(i=1;i<=n;i++)
{
cin >> a[i];
b[i]=a[i];
sum+=a[i];
}
if(sum%n)
{
cout << "NO\n";
return ;
}
int res=sum/n;
int ans=0;
for(i=2;i<=n;i++)
{
a[i]+=ans;
ans=0;
if(a[i]!=res)
{
a[i]--;
ans++;
}
}
a[1]+=ans;
int ok=0;
for(i=1;i<=n;i++)
{
if(a[i]!=res)
{
ok=1;
break;
}
}
if(ok0)
{
cout << "YES\n";
return ;
}
ans=1;b[1]--;
for(i=2;i<=n;i++)
{
b[i]+=ans;
ans=0;
if(b[i]!=res)
{
b[i]--;
ans++;
}
}
b[1]+=ans;
ok=0;
for(i=1;i<=n;i++)
{
if(b[i]!=res)
{
ok=1;
break;
}
}
if(ok0)
{
cout << "YES\n";
return ;
}
cout << "NO\n";
return ;
}
E题
没啥思路,可以先考虑最大元素怎么操作,不可能只修改一个元素值,题目强调过程中元素不能为负,也就是最大元素相邻至少还有一个最大的,否则消不掉,也就是不能出现极大值点
include <bits/stdc++.h>
using namespace std;
define int long long
const int N=200010;
int a[N],b[N];
void solve()
{
int n,i,j;
cin >> n;
for(i=1;i<=n;i++)
cin >> a[i];
a[0]=0,a[n+1]=0;
for(i=1;i<=n;i++)
{
if(a[i]>a[i-1]&&a[i]>a[i+1])
{
cout << "No\n";
return ;
}
}
cout << "Yes\n";
return ;
}
signed main ()
{
int t;
cin >> t;
while(t--)
solve();
return 0;
}
F题
浙公网安备 33010602011771号