【題解】 Codeforces Round #552 (Div. 3)

目錄

A

B

C

D


A

題意:給你4個不知道順序的值,分別爲(a+b)、(a+c)、(b+c)、(a+b+c)

          你需要任意輸出三個正整數 A  B  C

解: 既然A  B  C都爲正整數,那麼a+b+c一定是最大的,排序輸出即可

/**
* Copyright(c)
* All rights reserved.
* Author : Mingzhe
* Description : sample
*/
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <cstring>
#include <sstream>
#include <memory.h>
#define MAXN 105
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

ll x[MAXN];

int main(){
    for(int i=0;i<4;i++){
        cin>>x[i];
    }
    sort(x,x+4);
    cout<<x[3]-x[0]<<' '<<x[3]-x[1]<<' '<<x[3]-x[2]<<endl;
    return 0;
}

 

B

題意:給你一個長爲N的序列,可以對每一個元素進行一次操作

操作:1. +D   2. -D   3.啥也不做

問有沒有一個數D 能通過這些操作,是序列所有元素相等,不存在輸出-1

 

解:分情況討論即可

/**
* Copyright(c)
* All rights reserved.
* Author : Mingzhe
* Description : sample
*/
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <cstring>
#include <sstream>
#include <memory.h>
#define MAXN 105
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

int x[MAXN];
int ans[MAXN];

int main(){
    memset(x,0,sizeof(x));
    int n,p;
    int sum=0;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>p;
        if(!x[p])sum++;
        x[p]++;
    }
    if(sum>3){
        cout<<-1<<endl;
        return 0;
    }
    if(sum==3){
        int p=0;
        for(int i=0;i<=100;i++){
            if(x[i]){
                ans[p++] = i;
            }
        }
        int cal = ans[2]-ans[1];
        if(cal!=ans[1]-ans[0]){
            cout<<-1<<endl;
        }
        else{
            cout<<cal<<endl;
        }
    }
    else if(sum==2){
        int p=0;
        for(int i=0;i<=100;i++){
            if(x[i]){
                ans[p++] = i;
            }
        }
        int k = ans[1]-ans[0];
        if(k%2==0) k/=2;
        cout<<k<<endl;
    }
    else{
        cout<<0<<endl;
    }
    return 0;
}

 

C

題意: 有隻貓去旅行,星期一、四、日 吃魚,星期二、六 吃兔子,星期三、五 chinken

現給它N魚 M兔子 Kchinken 它可以選擇哪一天開始,問最多能走多久?

 

解: 簡單貪心,7天爲一週期,剩下的枚舉從哪天開始比較好就行

/**
* Copyright(c)
* All rights reserved.
* Author : Mingzhe
* Description : sample
*/
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <cstring>
#include <sstream>
#include <memory.h>
#define MAXN 105
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

int main(){
    ll a,b,c;
    ll sum=0;
    cin>>a>>b>>c;
    ll p = min(min(a/3,b/2),c/2);
    a -= p*3;
    b -= p*2;
    c -= p*2;
    sum += 7*p;
    int cal=0;
    for(int i=0;i<7;i++){
        int val=0;
        int num1=a,num2=b,num3=c;
        for(int j=0;j<7;j++){
            int z=(i+j)%7;
            if(z==0 || z==3 || z==6){
                num1--;
            }
            else if(z==1 || z==5){
                num2--;
            }
            else{
                num3--;
            }
            if(num1<0 || num2<0 || num3<0)break;
            val++;
        }
        cal = max(cal,val);
    }

    cout<<sum+cal<<endl;
    return 0;
}

 

 

D

題意:有一個機器人有電池 A 後備隱藏能源 B,給一段長爲N的路

           路爲1表示該段有陽光,使用電池通過有陽光的地段,可以使後備隱藏能源+1

           問該機器人最長能走多遠?

 

解:分情況討論,重要的是在有陽光的地方,如果後備隱藏能源滿了,就沒有必要花費電池的能量了。

/**
* Copyright(c)
* All rights reserved.
* Author : Mingzhe
* Description : sample
*/
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <cstring>
#include <sstream>
#include <memory.h>
#define MAXN 200005
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

int x[MAXN];

int main(){
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=0;i<n;i++){
        cin>>x[i];
    }
    int ans = 0;
    int sum=k;
    for(int i=0;i<n;i++){
        if(x[i]){
            if(sum==k || !m){
               sum--;
            }
            else{
                m--;
                sum++;
                if(sum>k){
                    sum = k;
                }
            }
        }
        else{
            if(sum){
                sum--;
            }
            else{
                m--;
            }
        }
        if(m<0 || sum<0) break;
        ans++;
    }
    cout<<ans<<endl;
    return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章