SYNC13C SPOJ 错误答案
Posted
技术标签:
【中文标题】SYNC13C SPOJ 错误答案【英文标题】:SYNC13C SPOJ Wrong answer 【发布时间】:2014-01-22 10:49:17 【问题描述】:Link to challenge
Ramesh 和 Suresh 分别在彩票中得到一个装满五颗星的盒子。自从 两个盒子不需要有相同数量的巧克力,它们 决定玩游戏。获胜者将获得两盒 巧克力。他们交替进行,Suresh 开始比赛。给定 两个盒子里的巧克力数量,让它们分别是 c1 和 c2, 玩家拿走 c1 或 c2 数量的巧克力,然后除以 剩下的一盒巧克力到两盒(这两盒不需要 有相同数量的巧克力)。无法做出这样的玩家 动输。输入
输入的第一行包含一个数字 T(1
(1
输出为每个测试用例打印“Ramesh”或“Suresh”,具体取决于谁 是赢家。
输入:2 3 1 4 5
输出:拉梅什·苏雷什
这是我的尝试,它给了我错误的答案。也给我一些测试用例。
#include<stdio.h>
int main()
int t,c1,c2,max,count,min;
scanf("%d",&t);
while(t--)
scanf("%d%d",&c1,&c2);
min=c1<c2?c1:c2;
max=c1>c2?c1:c2;
if(max%2!=0 && min%2!=0)
printf("Ramesh\n");
else if(min%2==0 && max%2!=0)
printf("Suresh\n");
else if(max%2==0 && min%2!=0)
printf("Ramesh\n");
else printf("Suresh\n");
return 0;
【问题讨论】:
有趣的一个。有一件事是肯定的:您不使用if else if
,而是使用一些递归算法。例如,你取 c1-1 个小于 c1 的数字,并将所有可能的对添加到 c1。对于 c1 = 5,您有 1、2、3、4,因此 1-2、1-3、1-4、2-3、2-4、3-4 并保留 1-4 和 2-3。然后你递归地做同样的事情。只是第一个想法。顺便说一句,我喜欢数学!
【参考方案1】:
代码比这简单得多。首先,让我解释一下算法。
让W
是一个数组,
W[i] = 1 if the user wins by choosing to split the box of i chocolates and 0 if he looses.
让我们构造这个数组,我们将得到一个模式。
W[1] = 0, since one can't split the box of one chocolate.
对于所有i>1
,我们有:
W[i]
= 1 如果存在整数a
和b
使得a+b=i
和W[a]=W[b]=0
,0
否则。
上面的陈述暗示,为了让用户通过选择i
巧克力盒获胜,他需要确保无论他进一步选择哪个盒子,他的对手都会输。他的对手输了意味着W[a]=W[b]=0
和a+b=i
。
如果我们尝试填充我们得到的这个数组,
W : 1 2 3 4 5 6 7...
值:0 1 0 1 0 1 0...
这意味着如果给定的整数之一是even
,那么suresh 将获胜。如果两个都是odd
,那就意味着ramesh会赢。
希望我清楚。
【讨论】:
【参考方案2】:#include<stdio.h>
int main()
int t;
scanf("%d",&t);
while(t--)
int a,b;
scanf("%d%d",&a,&b);
if(a%2==1 && b%2==1)
printf("Ramesh\n");
else
printf("Suresh\n");
return 0;
【讨论】:
以上是关于SYNC13C SPOJ 错误答案的主要内容,如果未能解决你的问题,请参考以下文章
spoj 中的 SIGSEGV 错误,但在 ideone 中工作正常