1. 程式人生 > 實用技巧 >Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)

題意: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;
const
int 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; }
View Code

題意:給定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