Educational Codeforces Round 121 (Rated for Div. 2)

C. Monsters And Spells

题目描述:有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;
}

 

posted @ 2022-03-10 21:47  怀义💭🚀🎈  阅读(44)  评论(0)    收藏  举报