Educational Codeforces Round 121 (Rated for Div. 2)
题目描述:有nn只怪物,出现在kiki时刻拥有血条hihi,假设不释放能量是释放了00的能量,那么每次你可以释放比前一次多一的能量,或者释放11点能量,只有当释放的能量不小于hihi时才能杀死怪物,问将所有怪物杀死的最小能量释放数。

思路:对于第ki秒的怪物,杀死他至少需要从need=ki-hi+1秒开始释放技能,从后往前枚举 ,比较第ki-1只怪物出现的秒数和need的大小(取较小的),直到need位置固定,此时need到最先的ki怪物之间的距离为从首相为need,末项hi,差为1的等差数列求和。
#include <bits/stdc++.h> using namespace std; ; #define int long long #define endl '\n' const int N=1e5+10; string a[N]; int n,T; map<char,int>mp; int k[N],h[N]; signed main(){ cin>>T; while(T--){ cin>>n; for(int i=1;i<=n;i++) cin>>k[i]; for(int i=1;i<=n;i++) cin>>h[i]; int need=0,idx=n,sum=0; int l,r; while(idx>=0){ need=k[idx]-h[idx]+1; r=k[idx]; idx--; while(idx&&k[idx]>=need){ l=k[idx]-h[idx]+1; need=min(need,l); idx--; } r=r-need+1; sum+=r*(r+1)/2; } cout<<sum<<endl; } return 0; }

浙公网安备 33010602011771号