2020(11.01)-CCPC-绵阳-(D,G,J,K,L)题解

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

D.Defuse the Bombs(二分答案)

思路:直接二分答案K,判断能不能在K次操作以内,把所有的数都变成 >= K就行了。最后答案等于K+1

AC代码:

#include <bits/stdc++.h>
#define int long long
#define showcase cout<<"Case #"<<cas++<<": ";
using namespace std;
int a[100050];
int T,cas = 1;
int n,m;
bool check(int k){
   
   
    int res = 0;
    for(int i = 0 ; i < n ; i ++){
   
   
        if(k<=a[i]) continue;
        res += max((int)0,k-a[i]);
        if(res > k ) return false;
    }
    return res <= k;
}

signed main(){
   
   
    cin>>T;
    while(T--){
   
   
        cin>>n;
        for(int i = 0 ; i < n ; i ++)
            cin>>a[i];
        int l = 0,r = 1e18;
        int res = 0;
        while(l <= r){
   
   
            int mid = (l+r)>>1;
            if(check(mid)){
   
   
                res = max(res,mid);
                l = mid+1;
            }else{
   
   
                r = mid-1;
            }
        }
        cout<<"Case #"<<cas++<<": "<<res+1<<endl;
    }
}

G.Game of Cards(博弈)

思路:比赛时还是没有想出来。后来仔细推了一下感觉也不是很难。但是分很多很多种情况。首先可以很容易的发现,答案和 cnt1%3 的值有关,并且和 cnt0%2 的值有关,与cnt3无关。

  • 首先考虑 cnt0 == 0 的情况,那就是如下图所示的情况了。显然当cnt2 等于0 或者 不等于0 时都是一个关于3的循环(但是两者不相同)。那就直接按规律输出就好了。
  • 对于cnt0 != 0 的情况。还得特判,如果后面三个都是0,那么只能 0+0 了,也就是每次减少一张 0卡牌 的数量。那么答案和 cnt0 的奇偶性有关。
  • 对于cnt0 != 0 且 后面不全为0的情况,还要判断,cnt2 是 0 还是1,因为对于 cnt2 >= 2 ,那么所有的转移都是相同的。而当cnt2 == 1 和cnt2 == 0 时,转移方向虽然是相同的,但是转移的结果不相同。所以还得区分。(反正就是一堆特判)
  • 对于剩下的规则的状态,就判断能不能找到一个状态使得转移之后还是必胜态了。

在这里插入图片描述

AC代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int cas = 1;
int tt1[3] = {
   
   0,0,1};       // 2号卡牌数量为0 的胜负情况
int tt2[3] = {
   
   0,1,1};       // 2号卡牌数量非0 的胜负情况

void show(int x){
   
   
    cout<<"Case #"<<cas++<<": ";
    if(x) cout<<"Rabbit"<<endl;
    else  cout<<"Horse"<<endl;
}

signed main(){
   
   
    int t;
    cin>>t;
    while(t--){
   
   
        int cnt0,cnt1,cnt2,cnt3;
        cin>>cnt0>>cnt1>>cnt2>>cnt3;
        if(cnt1 + cnt2 + cnt3 == 0){
   
   
            if(cnt0 <= 1)
                show(0);
            else
                show(cnt0%2 == 0);
        }else{
   
   
            int flag1 = cnt0%2;
            cnt1 %= 3;
            if(cnt0 == 0){
   
                 // 没有0号卡牌的情况,直接按规律输出
                if(cnt2 == 0){
   
             // 没有2号卡牌的情况,特判
                    show(tt1[cnt1]);
                }else{
   
   
                    show(tt2[cnt1]);
                }
            }else if(cnt2 == 0){
   
           // 没有2号卡牌的情况,特判,又因为存在0号卡牌,要异或一下
                show(tt1[cnt1]^flag1);
            }else if

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值