codeforces div2#703AB
A
题意
给你n堆积木,第i个堆有hi个块,其高度就是其中的块数。在一次移动中,你可以选择从第i个堆里取出1块,加到i+1个堆里,问你可不可以让高度的顺序严格递增。
思路
用两个前缀和sum和need,sum用来记录所有块的数量,need从0开始,后面元素依次+1的总和(把每堆多余的统计起来,加到最后,也可实现递增),就只用比较sum和need的大小了,sum<need,就代表没有足够多的积木用来实现递增
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n;
cin>>n;
vector<int>a(n);
for(int i=0;i<n;i++)
cin>>a[i];
long long sum=0,need=0;
for(int i=0;i<n;++i)
{
need+=i;
sum+=a[i];
if(sum<need){
cout<<"NO\n";
return;
}
}
cout<<"YES"<<endl;
}
int main(){
int t;
cin>>t;
while(t--)
solve();
return 0;
}
本文介绍了解决Codeforces Div.2 #703 AB题目的思路,通过前缀和技巧,判断能否通过合理移动积木实现高度顺序递增。核心思路是利用sum记录总块数,need记录目标递增序列所需的额外块数。
418

被折叠的 条评论
为什么被折叠?



