直接拿样例讲:
input:
2
0111
0001
output:
First
第一行输入n
,接下来两行,均为长度为2*n
的字符串。 两个人A
和B
,A
先手,从第一个字符串中选择n
个数字,B
从第二个字符串中选择n
个数字,每轮选一个,轮流进行。 要求:
- 若第一个字符串的第
i
个数字被A
选过了,那么第二个字符串的第i
个数就不能被B
选了,同理选了第二个字符串,第一个字符串对应位置也不能选了; - 二者每次都进行最优选择;
A
胜输出First
,B
胜输出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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?