Google Kickstart 2020 Round A 分配问题

Posted

技术标签:

【中文标题】Google Kickstart 2020 Round A 分配问题【英文标题】:Google Kickstart 2020 Round A allocation problem in c 【发布时间】:2021-02-11 15:16:18 【问题描述】:

我已经用 C 语言编写了代码,但它似乎通过了示例案例,但是当涉及到测试案例时,它显示了错误的答案。 输入 输入的第一行给出了测试用例的数量,T.T 测试用例紧随其后。每个测试用例都以包含两个整数 N 和 B 的单行开始。第二行包含 N 个整数。第 i 个整数是 Ai,即第 i 个房子的成本。

输出 对于每个测试用例,输出一行包含 Case #x: y,其中 x 是测试用例编号(从 1 开始),y 是您可以购买的最大房屋数量。

限制 时间限制:每个测试集 15 秒。 内存限制:1GB。 1≤T≤100。 1≤B≤105。 1 ≤ Ai ≤ 1000,对于所有 i。 测试集 1 1≤N≤100。 测试集 2 1≤N≤105。 样本

输入

输出

3 4 100 20 90 40 90 4 50 30 30 10 10 3 300 999 999 999

案例 #1:2 案例#2:3 案例#3:0

在示例案例 #1 中,您的预算为 100 美元。您可以花 20 + 40 = 60 美元购买 1 号和 3 号房屋。 在示例案例 #2 中,您的预算为 50 美元。您可以花 30 + 10 + 10 = 50 美元购买第 1、第 3 和第 4 套房屋。 在示例案例 #3 中,您的预算为 300 美元。你不能买任何房子(所以答案是0)。

我的代码是

#include <stdio.h>

int main()
    int test;
    scanf("%d",&test);
    for(int i=1;i<=test;i++)
        int N;
        long int B;
        scanf("%d %ld",&N,&B);
        long int Case = 0,r=0;
        int array[10000];
        char ch;
        do 
            scanf("%d%c",&array[r],&ch);
            r++;
        while(ch!='\n');
        for (int k=0;k<N;k++)
            for (int m=k;m<N;m++)
                int temp;
                if(array[k]>array[m])
                    temp=array[k];
                    array[k]=array[m];
                    array[m]=temp;
                
            
        
        r=0;
        while(Case<=B)
            Case+=array[r];
            r++;
        
        printf("Case #%d: %d\n",i,r-1);
    

【问题讨论】:

由于 google 在线托管这些问题,在您的问题正文顶部附近的 google 网站上的问题的链接会很好。它可以让我不用进行网络搜索,然后猜测哪个结果会给我你正在查看的确切版本。 您的第一个错误是哪个测试用例?它是小样本,大样本等吗?另外,请记住,您的第一句话/段落应该是一个简短的口头摘要,几乎没有实际细节。这有助于我们在深入了解细节之前将注意力集中在手头的问题上。 如果你的代码有 cmets 解释你的推理/行动计划,那就太好了。此外,由于它失败了,您应该对您认为可能错误的地方进行一些分析。即使您的分析以 3 个完全随机且不相关的猜测结束,它也显示了您自己解决这个问题所付出的努力,并为我们节省了追溯这些步骤的努力。 至少,您的 cmets 和格式应该向我们展示每个 google 挑战的每个解决方案都相同的“模板代码”与只有这个唯一的“问题解决方案”不同的地方特别的挑战。我不应该阅读你软件的每一行来发现你什么时候能指出来。 最后...看起来你的输出循环:while(Case&lt;=B) 有意想不到的后果,这将使任何解决方案只能在纯粹的运气下才能接受。另请注意:“眼球”或手动阅读包含您的答案的文本文件以查看它是否符合预期是一个好主意。我敢打赌,在较大的文件中,您没有正确数量的连续答案语句,更不用说正确的答案值了。 【参考方案1】:

罪魁祸首是控制下面while循环的条件

while(Case<=B) /* the logic of condition expression is wrong*/
   Case+=array[r];
   r++;

一定是(r &lt; N &amp;&amp; Case+array[r]&lt;=B)r&lt;N 是必需的;您还必须检查数组索引)。线

printf("Case #%d: %d\n",i,r-1);

也是错误的。它必须更正为

printf("Case #%d: %ld\n",i,r);

另一个错误是int array[10000]; 中的数组大小。大小必须是100000,因为N 的值最多可以是100000

您的排序算法很慢。应该使用更快的算法或标准库函数qsort

【讨论】:

以上是关于Google Kickstart 2020 Round A 分配问题的主要内容,如果未能解决你的问题,请参考以下文章

Google Kickstart 2020 Round A 分配问题

Kickstart Terraform on GCP with Google Cloud Shell

2019 Google Kickstart Round H

2019 google kickstart round A

Google Kickstart 2018,测试用例中的回合错误

Google Kickstart Round A 2021-Rabbit House