首页 > 其他分享 >codeforce:800-900分段刷题总结

codeforce:800-900分段刷题总结

时间:2024-02-12 16:00:44浏览次数:52  
标签:900 800 奇数 int 硬币 cin 钱包 codeforce include

1.博弈论

Wallet Exchange
爱丽丝和鲍勃很无聊,于是他们决定用自己的钱包玩一个游戏。爱丽丝的钱包里有 a 枚硬币,而鲍勃的钱包里有 b 枚硬币。
双方轮流玩,由爱丽丝先走棋。在每个回合中,玩家将按顺序执行以下步骤:

  1. 选择与对手交换钱包,或保留现有钱包。
  2. 从玩家当前钱包中取出 1 个硬币。在执行此步骤之前,当前钱包中不能有 0 枚硬币。

无法在自己的回合中做出有效举动的玩家输。如果爱丽丝和鲍勃都以最佳方式下棋,则决定谁将赢得游戏。

分析
首先每个人必须取出 1 枚硬币,在取出硬币之前可以选择是否需要交换钱包,说明这种钱包的交换一定是有利于自己的。
那么我们可以忽略钱包的交换,直接看硬币总数。
因为爱丽丝先手,那么如果硬币总数为偶数,爱丽丝输,否则爱丽丝获胜。
从另一个角度说,只有硬币为0的时候,游戏才结束,说明我们更加应该关心硬币,而不是钱包的交换。

点击查看代码
#include <iostream>
#include <cmath>
using namespace std;

int main() {
	int _;
	cin >> _;

	while (_--) {
		int a, b;
		cin >> a >> b;
		if ((a+b) & 1)
			cout << "Alice" << endl;
		else
			cout << "Bob" << endl;
	}
	return 0;
}

Game with Integers
Vanya 和 Vova 正在玩一个游戏。游戏者得到一个整数 n 。轮到自己时,玩家可以在当前整数上加上 1 或减去 1 。玩家轮流下棋,万亚先下。如果万亚移动后整数能被 3 整除,那么他获胜。如果 10 步已过而万亚没有获胜,则沃瓦获胜。

请根据整数 n 编写一个程序,以确定在双方都下得最好的情况下谁会获胜。
分析
首先从整数n入手,如果n模3为0,先手必须移动,导致先手失败。
否则,如果n模3为1或2,都可以通过+1,-1的操作,使n模3为0。
用博弈论术语来讲,如果初始状态n%3==0,则此时为先手必败状态,除开此情况,其它情况都是先手必胜状态。

点击查看代码
#include <iostream>
using namespace std;

int main() {
	int t, n;
	cin >> t ;
	while (t--) {
		cin >> n;
		if (n == 1) {
			cout << "First" << endl;
			continue;
		}
		if (!(n % 3)) {
			cout << "Second" << endl;
			continue;
		} else {
			cout << "First" << endl;
		}
	}
	return 0;
}

Mahmoud and Ehab and the even-odd game
马哈茂德和埃哈布在玩一个叫偶数游戏的游戏。Ehab 选择他最喜欢的整数 n ,然后他们从 马哈茂德 开始轮流玩。
在每个玩家的回合中,他必须选择一个整数 a ,并从 n 中减去它,使得:
1 ≤ a ≤ n 。
如果轮到马哈茂德, a 必须是偶数,但如果轮到埃哈布, a 必须是奇数。
如果当前玩家无法选择任何满足条件的数字,那么他就输了。如果他们都以最佳方式下棋,你能确定胜负吗?
分析
如果n为偶数,那么可以直接选a=n,直接令n=0,获胜,否则的话,n为奇数,先手操作后必为奇数,同理得到后手获胜

点击查看代码
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
typedef long long ll;
#define endl '\n';
using namespace std;
ll t[110];

int main() {
//	int _;
//	cin >> _;
//	while (_--) {
//
//	}
	int n;
	cin >> n;
	if (n & 1) {
		cout << "Ehab";
	} else {
		cout << "Mahmoud";
	}
	return 0;
}

Game With Sticks
在 2014 年国际奥林匹克运动会上摘金夺银后,阿克沙特和马尔维卡想找点乐子。现在,他们正在一个由 n 根水平棍和 m 根垂直棍组成的网格上玩游戏。
交点是网格上由一根水平木棒和一根垂直木棒的交点组成的任意一点。
游戏规则非常简单。玩家轮流移动。Akshat 赢得了金币,所以他先走一步棋。
在他/她移动的过程中,玩家必须选择任何剩余的交叉点,并从网格中移除所有经过此点的木棒。如果玩家无法移动(即在他/她移动时,网格上没有剩余的交叉点),他/她将输掉游戏。
假设两位棋手都以最佳状态下棋。谁会赢得比赛?
分析
首先我们要考虑多种情况,
1.一条水平,一条竖直
2.一条水平(竖直),多条竖直(水平)
3.多条水平,多条竖直
第1,2种情况,我们只能移动一步,即先手必胜,
第3种情况,每移动一步,水平数-1,竖直数-1,最后会化为情况1,2(类似于化归,递归)
也就是说我们只用考虑1,2情况,然后把第3种情况用解决第1,2种情况的方法解决。
显然,一条水平(竖直)的时候,先手必胜,拓展一下,因为每一回合,水平和竖直木棒都-1,同时决定游戏结束的为数量最少的那一种木棒(水平或竖直),
那么数量较少的那个方向的木棒,如果为奇数,则先手必胜,否则,先手必败

点击查看代码
#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int a[110000];
//vector<int>m;
int m = 1000000;

int main() {
	int n, m;
	cin >> n >> m;
	int sum = min(m, n);
	if (sum & 1) {
		cout << "Akshat" << endl;
	} else {
		cout << "Malvika";
	}
	return 0;
}

这些题目告诉我们,可以从最简单的问题入手考虑,考虑什么是必败态,什么是必胜态,然后拓展到多种情况,值得注意的是,需要将问题情况考虑全面才不容易出错,否则代码就会因为遗漏情况二出错

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
数论

给你一个整数 n 。请检查 n 是否有一个奇数除数(是否存在这样的数 x ( x > 1 ),即 n 能被 x 整除,且 x 是奇数)。

例如,如果有 n=6 ,那么就有 x=3 。如果是 n=4 ,则不存在这样的数。
分析
首先我们得想到

  • 偶*偶=偶
  • 偶*奇=偶
  • 奇*奇=奇

如果数字 x 有奇数除数,那么它就有奇数质数除数。
如果 x 没有奇数除数,那么 x 就为2的幂,因为合数一定是素数的倍数嘛(类似于线性筛的原理),偶数中只有2为素数。
所以有奇数除数,必有奇数素数除数。
所以现在我们能得出结论,如果 x 为2的幂,则不存在,否则存在。

点击查看代码
#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
using namespace std;
typedef long long ll;
int a[110000];
//vector<int>m;
int m = 1000000;

int main() {
	int T;
	cin >> T;
	while (T--) {
		ll n;
		cin >> n;
		if ((n & (n - 1)) == 0) {//注意运算符优先级
			cout << "NO" << endl;
		} else {
			cout << "YES" << endl;
		}
	}
	return 0;
}
/*
如果数字 n 是 2 的幂,那么它在二进制符号中只包含一个单位1。那么除了 n 中的单位所在的位置外,
(n−1)的所有位置都包含单位1。因此,它们的比特 "AND "(&)不包含单位1。
*/

标签:900,800,奇数,int,硬币,cin,钱包,codeforce,include
From: https://www.cnblogs.com/STArunning/p/18013943

相关文章

  • Codeforces Round 924 (Div. 2)
    E-ModularSequence题意给定\(n,x,y,s\),求是否有长为\(n\)的一个数列\(\{a\}\)满足\(a_1=x\)且\(\foralli>1:a_i=a_{i-1}+y\lora_i=a_{i-1}\bmody\)且\(\sum\limits_{i=1}^{n}a_i=s\)。\(\sumn,\sums\le2\times10......
  • Codeforces Round 924 (Div. 2)
    不会F的场。ACode#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){ ios::sync_with_stdio(false); cin.tie(0); intt; cin>>t; while(t--){ inta,b; cin>>a>>b; intf=0; if(a%2==0&&am......
  • Codeforces Round 924 (Div. 2)
    CodeforcesRound924(Div.2)A-RectangleCutting解题思路:初始矩形长宽为\((a,b)\),如果我们切\(a\),那么一定不能再拼接\(a\),否则一定一样。所以我们拼接\(b\),即将\(a\)对半分开得到两个\((\frac{a}{2},b)\)矩形拼接。此时,如果\(\frac{a}{2}=b\)那么拼接出来的矩形和初......
  • Codeforce-- 思维题
    2-11Eatthechip思路:题意可知,a从下往上走,b从上往下走,我们可以思考一个问题,在某一个回合,如果a和b在同一列中(a是Alice,b是Bob),一方怎么走,另外一方就跟着这一方走,所以同一列的时候是该回合后手的必胜态,先手的必败态。于是可以递推:如果在走到边界的时候有机会仍然保持b在a的上方,那么......
  • Codeforces Round 905 (Div. 3)
    题目链接A.先算距离,特判0的位置,最后加4#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){strings;cin>>s;s=""+s;intlast=1,now,ans=0;for(inti=1;i<s.si......
  • Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)
    目录题目链接题意题解代码题目链接C.DigitalLogarithm题意给两个长度位\(n\)的数组\(a\)、\(b\),一个操作\(f\)定义操作\(f\)为,\(a[i]=f(a[i])=a[i]\)的位数求最少多少次操作可以使\(a、b\)两个数组变得完全相同题解性质:对于任何数,经过两次操作我们一定可以让其变为\(......
  • CodeForces 1286C2 Madhouse (Hard version)
    洛谷传送门CF传送门可以把限制看成\(0.75n^2\)。发现\(0.75n^2=0.5n^2+2\times0.5(\frac{n}{2})^2\)。这启发我们询问一次\([1,n]\)和两次长度为\(\frac{n}{2}\)的区间。不妨问\([1,n],[1,\frac{n}{2}],[1,\frac{n}{2}+1]\)试试。注意到把\([1,\frac......
  • Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)
    很意思的一道构造题题意:给一个\(n、k\),让构造长度为n的数组满足,子数组为整数的个数为k个,负数的为\(k-(n+1)*n/2\),每个数的范围为\([-1000,1000]\)这种构造题可以考虑就是前一段可以一直用一样的、最小的。我们观察可以发现\(k+k-(n+1)*n/2=(n+1)*n/2\)也就是所有子数组......
  • CodeForces 1927G Paint Charges
    洛谷传送门CF传送门看到\(n\le100\)考虑\(O(\text{poly}(n))\)dp。发现从左向右决策,因为一个点可以向左或向右覆盖,所以需要记最靠左的未覆盖的位置\(j\)和最靠右的已覆盖位置\(k\),状态就是\(f_{i,j,k}\),dp最小的覆盖次数。转移的讨论很简单。考虑不覆盖还是向左......
  • Codeforces Round 919 (Div. 2)
    https://codeforces.com/contest/1920B还行,C、Egood(E据说是很典的dp但我是dp苦手),D、F1无聊,F2不会A.SatisfyingConstraints*800有\(n\)个条件,每个条件形如\(x\gek,x\lek\)或\(x\neqk\),\(k\)为整数。问满足条件的整数\(x\)的个数。先处理\(\ge,\le\),得到限制......