Codeforce 1491C Pekora and Trampoline(思维+差分)

网友投稿 327 2022-11-16

Codeforce 1491C Pekora and Trampoline(思维+差分)

​​题目链接​​

题目大意: 有n个跳床,每个跳床有一个跳的距离,每个跳床跳一次就会使得弹跳距离减1,弹跳距离max(1,a[i])。你可以选择任意跳床选择开始,问你最少经过几个轮回才能将所有跳床弹跳距离都变成1。

思路: 差分维护 首先我们要将全部都转化成1,那么最优的方法就是从第一个大于1的弹床开始跳,这样一定是最优的。我们假设第一个是a[i],那么他第一次跳到(i+a[i])上,第二次跳到(i+a[i]-1)…知道最后一次从i点开始跳就跳到(i+2)上。一共跳了(a[i]-1)次。 注意这个地方:其实就是来积累前面跳到这个地方的.

if(tmp<1) { if(i+1<=n) { b[i+1]+=(1-tmp);///会前面变1走的次数 } if(i+2<=n) { b[i+2]-=(1-tmp);///后端维护了 }}

#include #include #include #include #include#include#include#include #include typedef long long ll;typedef unsigned long long ull;using namespace std;typedef pair pii;#define#define#define#define#define#defineconst int maxn=2e5+10;#define#define#defineconst int mod=1e9+7;const int MOD=1e9+7;inline int read() { int x=0; bool t=false; char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=true,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return t?-x:x;}ll n,m,d;ll a[maxn],b[maxn];ll ans;string str;int main() { ll t; cin>>t; while(t--) { cin>>n; for(int i=1; i<=n; i++) { scanf("%lld",&a[i]); b[i]=0; } ans=0; for(int i=1; i<=n; i++) { b[i]+=b[i-1];///积累贡献 ///cout<<"i "<1) ans+=tmp-1;///需要 if(a[i]>1) { if(i+2<=n) {///最后一次跳 b[i+2]++;///维护差分 } if(i+a[i]+1<=n) { b[i+a[i]+1]--;///维护差分 } } if(tmp<1) { if(i+1<=n) { ///cout<

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:测试测量技术如何保证O-RAN网络的成功部署
下一篇:Java线程启动为什么要用start()而不是run()?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~