E - soyorin的数组操作(easy)
原题链接:E-soyorin的数组操作(easy)_2024牛客寒假算法基础集训营5 (nowcoder.com)
知识点:贪心,递推
题意:
思路:
按题意如果n为偶数,那么一直加下去,k取n无数次,越靠后的数加的越多,迟早成为非降序;
而n为奇数时,n==1为特例,本身就是非降序,其他n为奇数的情况,每次计算n为奇数和n-1之间的差值,就可以计算出,取值k==n-1的次数,计算出n-1与n-2的值,比较两个值是否满足非降序若不是输出NO结束,是则继续往下递推。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve(){
int n;
cin>>n;
int a[n+1];
for(int i=1;i<=n;i++)
cin>>a[i];
if(n%2==0 || n==1)
cout<<"YES"<<endl;
else{
int sum=0;
for(int i=n-1;i>=2;i-=2){
a[i]+=sum*i;
a[i-1]+=sum*(i-1);
if(a[i]>a[i+1]){
cout<<"NO"<<endl;
return ;
}
int num=(a[i+1]-a[i])/i;
sum+=num;
a[i]+=num*i;
a[i-1]+=num*(i-1);
if(a[i-1]>a[i]){
cout<<"NO"<<endl;
return ;
}
}
cout<<"YES"<<endl;
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}