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

本文详细解答了Codeforces Round #552 (Div. 3)比赛中的四道题目,包括A、B、C、D四个部分。A题关键在于确定a+b+c为最大值,排序后输出;B题需通过操作使序列所有元素相等,采取分情况讨论;C题是一道关于猫旅行吃食的贪心问题,通过7天为周期的枚举求解最大旅行天数;D题涉及机器人路径规划,利用阳光补充能源,同样需要分情况讨论策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值