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

题解&spm=1001.2101.3001.5002&articleId=109548689&d=1&t=3&u=e84397415ff5437db724d37ac41536d2)
5686

被折叠的 条评论
为什么被折叠?



