Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)
阿新 • • 發佈:2020-11-03
題意:0代表沒有炸彈,1代表有炸彈,點燃一個炸彈可以引起連鎖反應,花費是a,可以在沒沒有炸彈的地方新增炸彈,花費為吧,然後構成連續的炸彈,引起連鎖反應。
思路:統計每段連續的1的起始位置和結束位置。然後相鄰的兩段的1中間的0的個數為 ans ,如果 b * ans < = a, 說明填炸彈更划算,如果 b * ans > a, 則把前面的連續的炸彈花費 a 引爆就行 ,後面的在和下一個連續的1進行配對。(需要特判全是0的情況)。
#include<bits/stdc++.h> using namespace std; typedef long long LL; constView Codeint N=1e5+10; int main() { int t; cin>>t; while(t--){ int a,b; pair<int,int>q[N]; cin>>a>>b; string s; cin>>s; int l=0; int _size=s.size(); int falge=0; for(int i=0; i<_size; i++){if(s[i]=='1') falge=1; if(s[i]=='1'&&i==0){ q[l].first=i; } else if(s[i]=='1'&&s[i-1]=='0'){ q[l].first=i; } if(s[i]=='1'&&i==_size-1){ q[l].second=i; l++; } else if(s[i]=='1'&&s[i+1]=='0'){ q[l].second=i; l++; } } int ans=0; for(int i=1;i<l;i++){ int sum=(q[i].first-q[i-1].second-1)*b; if(sum<=a){ ans+=sum; } if(sum>a){ ans+=a; } } if(falge==1) cout<<ans+a<<endl; else cout<<"0"<<endl; } return 0; }
題意:給定n,和陣列an,bn。
選ai或bi。ai是快遞員自己送餐來,時間不疊加,bi是自己去取,時間要疊加,問最少多少時間能將這些快遞全部取了。
思路: 按照快遞員送餐的時間進行排序,如果送餐的時間相同就把自己取餐的時間短的放後面。因為我們最大時間取決於我們快遞時間最長以及自己去取的時間,因而我們只要一直增大自己取的時間,減少最大快遞時間,即可得到最短時間.
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10; int cmp(pair<int,int>a,pair<int,int>b){ if(a.first!=b.first)return a.first<b.first; else return a.second>b.second; } int main() { int t; cin>>t; while(t--) { int n; pair<ll,ll>p[N]; cin>>n; for(int i=0;i<n;i++){ cin>>p[i].first; } for(int i=0;i<n;i++){ cin>>p[i].second; } sort(p,p+n,cmp); p[-1].first=0; for(int i=0;i<n;i++) // cout<<p[i].first<<"****"<<p[i].second<<endl; ll Max=0; ll sum=0; int i; for( i=n-1;i>=0;i--){ if(p[i].first>=sum+p[i].second){ sum+= p[i].second ; } else break; } cout<<max(p[i].first,sum)<<endl; } return 0; }View Code