我正在解决一个问题。但是我缺少了一些东西。我的解决方案有一些测试用例是错误的。我需要找到该测试用例。 对于另一个子任务,就是说执行花费了太长时间。
主厨的知识和能力分别等于N和M时,他将有权使用“话语”。最初,他有权力 1和知识1。
厨师可以执行以下几种动作来提高其技能:
- 解决问题-用X增加他的知识
- 俯卧撑-将力量提高Y
- 安装ShareChat与朋友保持联系-将知识和能力提高1
厨师最多只能安装一次ShareChat。其余动作可以执行任意次,并且动作可以是 以任何顺序执行。
帮助厨师找出是否有可能从讨论转移到话语。
输入
输入的第一行包含一个单个整数T,表示测试用例的数量。 T测试用例的说明如下。
每个测试用例的第一行也是唯一一行包含四个用空格分隔的整数N,M,X和Y。
输出
对于每个测试用例,如果有可能达到要求的知识,则打印包含一行“ Chefirnemo”的一行 电源或“ Pofik”(如果不可能)
您也可以访问此链接以阅读问题 链接到问题https://www.codechef.com/SEPT18B/problems/CHEFADV 我的解决方案-
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long int n,m,x,y,power,know;
scanf("%ld%ld%ld%ld",&n,&m,&x,&y);
power=1;
know=1;
if(power+1==m && know+1==n)
printf("Chefirnemo\n");
else {
while(power+y<m)
power=power+y;
if(power+y==m)
power=power+y;
while(know+x<n)
know=know+x;
if(know+x==n)
know=know+x;
if(power==m && know==n)
printf("Chefirnemo\n");
else if(power+1==m && know+1==n)
printf("Chefirnemo\n");
else
printf("Pofik\n");
}
}
return 0;
}
答案 0 :(得分:2)
如果x==1
和(m-1)%y==1
或相反(即y==1
和(n-1)%x==1
),您的代码将失败。然后,在安装ShareChat无法解决问题时,迭代次数将从power
增加到n
,将know
增加到m-1
。但是,如果您仅将power
增加到n-1
,则安装ShareChat会得到匹配。
正确的解决方案应该更加小心地安装ShareChat。例如
bool chefirnemo(int n, int m, int x, int y)
{
// 0 check that input is okay
assert(1<=n && 1<=m && 1<=x && 1<=y);
// 1 change to the equivalent problem where power
// and knowledge are 0 initially
--n; --m;
// 2 try w/o installation of ShareChat:
if (n>=0 && (n%x)==0 && m>=0 && (m%y)==0)
return true;
// 3 install ShareChat
--n; --m;
// 4 try again
return (n>=0 && (n%x)==0 && m>=0 && (m%y)==0);
}
答案 1 :(得分:0)
您的规则不保证输入为正。如果X或Y为零,则循环永远不会终止。 (请注意,这是您的释义存在的问题,挑战规则确实可以确保正值)
测试用例:2 2 0 0
测试用例:2 4 0 2
测试用例:4 4 1 0
您应用(+ X,0)和(0,+ Y)多少次应取决于是否使用(+ 1,+ 1)动作...但是您已经锁定了决定
测试用例:5 6 1 2
答案 2 :(得分:-1)
尽管Walter确实指出了可能的提示。 该解决方案似乎无效。