【问题标题】:Which test case am i missing?我错过了哪个测试用例?
【发布时间】:2018-09-08 15:15:27
【问题描述】:

我正在解决一个问题。但我错过了一些东西。有一些测试用例我的解决方案是错误的。我需要找到那个测试用例。 对于另一个子任务,它说执行时间太长了。

如果厨师的知识和权力分别完全等于 N 和 M,他就可以访问 Discourse。最初,他有权力 1和知识1。

厨师可以执行以下类型的操作来提高他的技能:

  • 解决一个问题 - 增加他的知识 X
  • 做一个俯卧撑 - 将他的力量增加 Y
  • 安装 ShareChat 以与朋友保持联系 - 知识和力量都增加 1 倍

Chef 最多只能安装一次 ShareChat。剩余的动作可以执行任意次数,并且这些动作可以是 以任意顺序执行。

帮助 Chef 了解是否可以从 Discuss 转到 Discourse。

输入

输入的第一行包含一个整数 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;
    }

【问题讨论】:

  • 请在问题中提供所需帮助的完整信息,而不是共享链接。它会帮助人们帮助你。
  • 超过时间限制
  • 了解模运算 (%) 它应该有助于解决 TLE 问题
  • 你标记了这个C++,但对我来说它看起来像C。我没有看到任何 C++ 用法。
  • 想知道活动中的问题是否在这里跑题了?!

标签: c algorithm testing


【解决方案1】:

如果x==1(m-1)%y==1 或反之亦然(即y==1(n-1)%x==1),您的代码将失败。然后,当安装 ShareChat 无法帮助时,您的迭代将增加 powernknowm-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);
}

【讨论】:

  • 顺便说一句,这个网站源于人们心存感激,这反映在接受答案和/或对答案或问题投票。
  • 对不起,我是新人。你能回复我之前的评论吗?
  • 即使你的回答也不正确,我的朋友。我尝试了一些测试用例,它没有给出想要的答案。例如- 2 2 1 2 它应该是真的。但是您的解决方案是错误的。在 5 2 3 0 等测试用例中,您的循环变得无限
  • 我以为1≤N,M,X,Y≤109,所以5,2,3,0是不允许的。我修复了另一个问题(顺便说一句,我的代码没有循环,所以不清楚你的意思)。
  • 我不知道这个问题的作者,但你的代码完美运行,这是我这边的 +10
【解决方案2】:
  1. 您的规则不能保证输入是正数。如果 X 或 Y 为零,则您的循环永远不会终止。 (注意,这是你的释义有问题,挑战规则确实保证了正值)

    测试用例:2 2 0 0

    测试用例:2 4 0 2

    测试用例:4 4 1 0

  2. 你应用多少次 (+X,0) 和 (0,+Y) 应该取决于是否使用了 (+1,+1) 动作......但你已经锁定了你的决定。

    测试用例:5 6 1 2

【讨论】:

  • 该问题有以下约束:约束 1≤T≤1,000 1≤N,M,X,Y≤109
  • @Slycoder:问题确实存在。你的问题没有。
  • 谢谢!我发现很难识别我的解决方案失败的测试用例。你能告诉我它是怎么做的吗?你是怎么知道的?
【解决方案3】:

虽然沃尔特确实指出了可能的提示。 该解决方案似乎不起作用。

【讨论】:

  • 绝对是的。他的代码无法克服我的代码的缺点。它有相同的问题
  • 这应该只是一个评论
猜你喜欢
  • 2014-08-16
  • 1970-01-01
  • 2021-06-16
  • 2022-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
相关资源
最近更新 更多