您当前的位置: 首页 > 

不牌不改

暂无认证

  • 3浏览

    0关注

    422博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

CodeForces 299C Weird Game

不牌不改 发布时间:2021-07-23 20:32:22 ,浏览量:3

题目大意

直接拿样例讲:

input:
2
0111
0001
output:
First

第一行输入n,接下来两行,均为长度为2*n的字符串。 两个人ABA先手,从第一个字符串中选择n个数字,B从第二个字符串中选择n个数字,每轮选一个,轮流进行。 要求:

  1. 若第一个字符串的第i个数字被A选过了,那么第二个字符串的第i个数就不能被B选了,同理选了第二个字符串,第一个字符串对应位置也不能选了;
  2. 二者每次都进行最优选择;
  3. A胜输出FirstB胜输出Second,平局Draw
题解

我一直觉得这题一个式子应该就能出来结果,所以想算出式子直接输出,但是经过昨天一晚上的努力失败了,我太高估自己了,居然妄想一下写出式子来。于是今天先按思路实现了一下,直接一发过,之后又调整成了完美代码!!!调整后的代码格式直接爱了!!!这就是程序员的浪漫嘛♥

言归正传! 贪心思路: step1: 二者都先选重合的,什么是重合的?就是同一个位置上,两个字符串都是1。两个人肯定要先争着抢到这些公共的,人都是贪心的,对于那些一定属于自己的1我们可以晚点再拿; step2: 接下来,我们可以悠哉游哉地选那些一定属于自己的1了; step3: 但是,可能存在这种情况。我们首先规定一定属于自己的1称为“npy”。如果存在一个人的 npy 个数很少,而另一个人的 npy 个数很多,当 npy 少的选完自己的 npy 后,看到另一个居然 npy 这么多,心生嫉妒,抱着“自己得不到别人也别想得到”的想法,就去破坏另一个人选 npy ,最终导致另一个人也没能将自己的 npy 全选上。

大致思路就分为上述三步,看着只有三步,但其实情况数还是很多的。

代码实现上我再稍微讲一下思路: 可以考虑到step1中重合的个数为奇数时,接下来的操作相当于B先手,而如果重合的个数为偶数,那么接下来还是相当于A先手。其实step1之后的某些情况中,A先手还是B先手没区别(需要自己揣摩了)。 step2中选自己的 npy 时也并非无所顾忌,要注意自己的 npy 可能很多,但是最多能选的很少。 step3本质上只是已经拥有比较多的 npy 的人之后得到少一点而已(不知道你能不能理解这里,不理解可以看代码)

代码(初稿,详细)
#include
using namespace std;
int m, allA, allB, AB;
string s1, s2;
int main()
{
	cin>>m>>s1>>s2;
	int n = (m difB?puts("First"):difA==difB||difA+1==difB?puts("Draw"):puts("Second");
		}
	}

	return 0;
}

代码(终稿,好看)
// ------ 太美了! ------ //
#include
using namespace std;
char ans[][10] = {"Draw", "First", "Second"};
int n, m, allA, allB, AB;
string s1, s2;
int main()
{
	cin>>m>>s1>>s2;
	n = (m             
关注
打赏
1662186765
查看更多评论
0.0425s