首页 > 其他分享 >【hdu 7548】SunBian

【hdu 7548】SunBian

时间:2024-08-29 09:26:37浏览次数:5  
标签:hdu cout int SunBian cin 7548 必胜 include 节点

题目链接:hdu 7548 SunBian (2024“钉耙编程”中国大学生算法设计超级联赛(10))

思路:
一道比较签到的题。
先说结论:
1.当n=k时A必胜
2.当k=1时,n为奇数A胜,否则B胜
3.其余情况全都为B胜

证明:
1.显然n=k时A可以一回合全部取完
2.k=1时双方只能轮流来,显然奇数A胜偶数B胜
3.此时A是无法一回合全部取完的,且A无论如何操作都会使环形的笋变成一条链
那么B此时需要进行的操作就是取中间的笋(若为奇数取中间一个,反之取中间两个),将整个链分成两部分,然后镜像对手的操作,即可保证必胜。(有点类似Nim石子游戏 只有两堆且两堆相同的情况,后手必胜)

举个例子:
n=8 k=2时
在这里插入图片描述
可以看到,无论A取一个还是两个节点,都会使得整个环形被变成一条链,这里以取一个节点为例:
在这里插入图片描述
此时剩余7个节点,B可以取第四个节点让整个图形变成两条相同的链,如图
在这里插入图片描述
此时若A取其中的某一个或者某两个连续的节点,B可以在另一条链上镜像对手的操作,如图(红色代表A的操作,绿色代表B的操作)
在这里插入图片描述
此时A只能在剩下两个节点里面任选一个了,而后B选另一个就可以保证B必胜。

如果A第一步选了两个节点,剩下一条长度为6的链,则B可以选择第3、4节点,让原图变成两条长度为2的链,显然仍然是B胜
​代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <stdio.h>
#include <set>
#include <map>
#include <stack>
#include <iomanip>
#include <numeric>
#include <cmath>
#include <functional>
#include <numeric>
#include <ctime>
#include <random>
#include <queue>
#include <vector>
#include <unordered_map>
#define sqr(x) ((x) * (x))
#define fo(x) for(int i=0;i<x;i++)
#define _for(a,b,c) for(int a=b;a<c;a++)
#define _rep(a,b,c) for(int a=b;a<=c;a++)
#define ll long long
#define inf 0x3f3f3f3f
#define endl '\n'
#define ull unsigned long long
#define int long long
#define MAXN 1000005
#define MAXM 26
#define mod 998244353
using namespace std;
void solve() {
	int n, k;
	cin >> n >> k;
	if (n == k) {
		cout << 'A';
		return;
	}
	if (k == 1) {
		if (n % 2 == 0) {
			cout << 'B';
		}
		else {
			cout << 'A';
		}
		return;
	}
	cout << 'B';
}
signed main() {
	cin.tie(nullptr)->sync_with_stdio(0);
	int t = 1;
	cin >> t;
	while (t--) {
		solve();
	}
}

标签:hdu,cout,int,SunBian,cin,7548,必胜,include,节点
From: https://blog.csdn.net/sgss222/article/details/141650144

相关文章

  • hdu7438
    题面给定长度为\(N\)的序列\(a\)。一个序列有很多个子序列,每个子序列在序列中出现了若干次。小马想请你输出序列\(a\)每个非空子序列出现次数的立方值的和,答案对\(998244353\)取模。数据范围:\(n,a_i\le250\)。题解一个很高级的trick,"出现次数的立方值"等价于"我......
  • hdu7439
    题面小马给出长度为\(n\)的正整数序列\(f,g\),现以如下方式生成\(n\)个点的有向图:forifrom1ton: forjfromi+1ton: iff[i]<f[j]andg[i]<g[j]: addedgefromitojelse: addedgefromjtoi试求出图中三元环的个数。数据范围:\(......
  • hdu2604
    用f(n)表示n个人满足条件的结果,那么如果最后一个人是m的话,那么前n-1个满足条件即可,就是f(n-1); 如果最后一个是f那么这个还无法推出结果,那么往前再考虑一位:那么后三位可能是:mmf,fmf,mff,fff,其中fff和fmf不满足题意所以我们不考虑,但是如果是 mmf的话那么前n-3可以找满足条件的......
  • SunBian
    SunBian显然,有如下的两种特殊情况:\(k=1\),此时每人只能操作一个,那么显然为奇数Alice必胜,为偶数Bob必胜;\(k=n\),此时Alice一次可以全部操作,那么Alice必胜。除此之外,Alice无论第一步如何操作,Bob都有一种方式,使剩下未操作的分成两个一样长的连续段(长度可以为),根据......
  • HDU-ACM 2024 Day4
    T1001超维攻坚(HDU7469)三维凸包,不会。T1002黑白边游戏(HDU7470)显然这道题没有一个固定的最优策略,所以只能\(\text{dp}\)决策。可以倒着做,设\(f_{i,S}\)表示从后往前进行了第\(i\simm\)轮,第\(i\)轮结束后(在原始意义下是开始前)黑边集合为\(S\),双方使用最优策......
  • HDU 3590 PP and QQ
    题目链接:HDU3590【PPandQQ】思路    树上删边问题,套个反尼姆博弈。    反尼姆博弈是取走最后一个石子的人输掉游戏,所以需要特判一些特殊情况。    1.有堆的石子个数都是1,所以堆数为奇数时,先手必败,否则先手必胜    2.所有堆中存在石子数为......
  • HDU 2873 Bomb Game
    题目链接:HDU2873【BombGame】思路    数据范围较小,直接暴力求所有状态的SG值,然后将棋盘上所有炸弹的对应位置的SG值异或起来就可以得到当前局面的结果。对于相同位置的上有两个炸弹会自动爆炸,本来他们的SG值的异或和就为0,所以可以不用管。代码intn,m,vis[N*N......
  • HDU 3980 Paint Chain
    题目链接:HDU3980【PaintChain】思路    第一次操作,无论从哪个珠子开始染色,都会得到相同的长度为n-m的链,然后就是在这条链中取一段长度为m的珠子染色,当这一段珠子在链条中间的时候,就会把链条分成两段,就是一个简单的两段连续珠子的长度的sg值异或一下,求出sg[n-m]的......
  • HDU 2999 Stone Game, Why are you always there?
    题目链接:HDU2999【StoneGame,Whyareyoualwaysthere?】思路    由于只能取连续的一段石子,当取出的石子是这段石子的中间一部分时就相当于将一段石子分成两段石子,简单异或一下求SG值就行了代码intsg[N],vis[N],a[N];intn,m,k;voidgetsg(){memset......
  • HDU-ACM 2024 Day3
    T1004游戏(HDU7460)注意到对于两个人,他们\(t\)轮后能力值相同的概率只与他们初始时的能力差有关,所以我们先\(\text{FFT}\)求出\(|a_i-a_j|=k\)的\((i,j)\)对数。构造多项式\(F(x)=(p_1x^2+p_2+p_3x)\),其中\(p_1,p_2,p_3\),分别表示在一轮中两个人相对......