Educational Codeforces Round 85 (Rated for Div. 2) C. Circle of Monsters(前缀和 预处理 贪心)

Wilona ·
更新时间:2024-11-14
· 768 次阅读

目录传送门题意:思路:代码: 传送门 题意:

在这里插入图片描述

思路:

先直接杀死第一个,然后sum[i]记录到杀死第i个时,需要的子弹,然后遍历从(2–n)开始杀死需要的子弹,因为刚才算过前缀和了,所以不用一个一个算了,只用处理好边界就行了
(边界就是,当从第i个开始时,要先把第i个杀死,而且第i个不能用第i-1的爆炸了,第一个不用直接杀死,可以用第n个的爆炸)

代码: #include #include #include #include #include #include #include #include #include #include #define pb push_back #define lb lower_bound #define ub upper_bound #define fi first #define se second #define all(x) (x).begin(),(x).end() #define SZ(x) ((int)(x).size()) #define debug(x) cout<<x<<endl #define rep(i,a,b) for(int i=a;i=b;i--) typedef long long ll; using namespace std; const int MAXN=1e5+50; const int inf=0x3f3f3f3f; const int mod=1e9+7; //::iterator it; struct sa{ ll a,b; }p[3*MAXN]; ll sum[3*MAXN]; int main() { std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int t; ll n,x; cin>>t; while(t--){ int n; cin>>n; ll mi=1e13,mii,ma=-1; rep(i,1,n){ sum[i]=0; cin>>p[i].a>>p[i].b; } if(n==1){ cout<<p[1].a<<endl; continue; } ll ans; ll k=p[1].b; sum[1]=p[1].a; for(int i=2;i<=n;i++){ sum[i]=sum[i-1]+max(1ll*0,p[i].a-k); k=p[i].b; } ans=sum[n];//从第一个开始的结果 for(int i=2;i<=n;i++){ ll cnt=p[i].a;//第i个必须直接杀死,没有爆炸 cnt+=sum[n]-p[1].a-max(0*1ll,p[i].a-p[i-1].b);//p[1].a是必须杀死第1个的时候用的,现在不用了,可以用n个爆炸,max(0*1ll,p[i].a-p[i-1].b),这个是以前用的爆炸现在不能用了 cnt+=max(1ll*0,p[1].a-p[n].b);//第一个可以用第n个的爆炸之后再用子弹 ans=min(ans,cnt); } cout<<ans<<endl; } return 0; } /* 1 3 7 15 2 14 5 3 */
作者:_Alexander



CodeForces rated circle round div

需要 登录 后方可回复, 如果你还没有账号请 注册新账号