繁体   English   中英

程序无法通过测试用例

[英]Program cannot pass test cases

Hacker Earth 上有一个名为 Dhoom 4 的问题:

Samarpit 是 Dhoom 4 的主要英雄。他正试图从 Code Bank Of Hackers 窃取。 Samarpit 有一把印有 integer 值的钥匙。 他还有 N 个其他键,每个键都有自己的特定值。 Samarpit 正试图破解他应该获得锁的密钥值的锁。 他可以执行一种类型的操作。 取他自己的密钥和其他 N 个密钥中的一个并将它们合并。 在合并期间,Samarpit 的 Key 值更改为两个键的模数 100000 的乘积。

例如,如果他的键值为 X,他拿了一个值为 Y 的键,他的新键将为(X*Y)%100000 。在合并过程中使用的另一个键与其他 N-1 个键一起保留.

整个合并过程需要 1 秒。 现在,由于他很匆忙,他要求您找出他可以到达锁的钥匙值的最短时间。

输入:

第一行包含 2 个整数。 它们是 Samarpit 的 Key 值和 Lock 的 key 值。

第二行包含 N,表示 Samarpit 拥有的其他密钥的数量。

第三行包含 N 个以空格分隔的整数,表示 N 个其他键的值。

Output:

获得锁的钥匙所需的最短时间。 如果他无法到达那个打印 -1。

约束:

  • 1≤N≤1000
  • 1 ≤ 所有键的值 ≤ 100000

我的代码是:

#include <stdio.h>
#include <time.h>

void main()
{
    int i,f=0,n,skey,lkey,t=0;
    long int a[1000],prod;

    scanf("%d",&skey);
    scanf("%d",&lkey);
    prod=skey;
    scanf("%d",&n);
    if(n<=1000)
    {
        for(i=0;i<n;i++)
            scanf("%ld",&a[i]);

        if(skey==lkey)
            printf("0");
        else
        {
            for(i=0;i<n;i++)
            {
                if(a[i]<=100000L && lkey % a[i]==0)
                {
                    prod=(a[i]*prod)%100000L;
                    t++;

                    if(prod==lkey)
                    {
                        f=1;
                        printf("%d",t);
                        break;                  
                    }
                    else
                        f=0;
                }
            }
        }

    }
    if(f==0)
        printf("-1");

}

我的程序适用于较小的输入,但不适用于较大的输入,例如:

18023 15115
356
18121 1326 22175 6108 24870 5429 25714 8945 22404 19339 21602 31878 10196 `14252 7186 6020 15854 2140 6205 25226 32646 14294 6218 30002 21596 17190 18465 8855 32436 28884 27710 5396 22534 27330 9219 22350 17910 12119 9811 28276 31622 7645 11356 27077 23179 8744 32436 2899 2398 17273 22696 28167 4307 6818 5585 19686 5743 29546 24040 20370 1749 7474 17114 20 17538 11993 1311 19928 11962 16862 29256 16889 5314 26820 4568 18624 26960 25787 5205 13415 19008 24188 14495 23842 12424 9845 7040 608 23662 16422 9603 20813 20985 15563 2826 13468 31141 10555 4763 20869 14682 4880 5499 22025 6559 26888 28286 31869 19212 15019 19229 26694 8189 6958 4809 16354 20110 11160 22655 10280 3779 4131 2717 1232 26886 21733 21748 8757 18647 1455 26910 11354 10175 32054 8465 5931 25733 12144 12277 23558 6821 29505 21811 12410 3582 3927 17871 6735 32459 3667 16375 1222 31188 7721 31964 15137 30950 32457 29888 27750 26496 17407 10576 7265 24527 28311 27189 9704 13276 8390 18406 12899 5893 29125 10432 19083 31658 9407 13400 25713 31016 18157 2320 4802 19979 30976 28648 14666 21119 26559 663 27320 28424 14321 30683 21409 27507 27005 2573 22215 10765 30160 11256 16026 8978 11647 32747 10239 13416 6445 17677 2641 6541 25008 12017 165 8143 879 23402 14419 27323 20750 23201 10418 23767 2382 32100 30754 30868 1070 24001 12880 19838 15191 21972 13237 17846 12726 22749 28256 26530 32363 25237 27638 24547 32482 28867 12535 26503 29759 15114 25922 23168 4096 7429 26076 4693 13277 26262 9197 22808 26867 1658 29963 2200 21026 17185 14523 10711 7604 30141 30517 10431 14911 31642 23912 28688 21196 20909 14910 413 22072 3695 24865 24248 3547 11756 5566 21739 1896 25622 25865 745 22036 26976 3969 10691 28411 30088 26805 7775 9407 23732 20487 28455 1650 705 9904 4606 9654 6360 26372 11896 2082 22850 16631 22602 18408 13693 24545 19967 10165 10895 15742 4077 7641 12186 9785 25448 6824 29361 21162 5685 3616 22506 14941 5697 28876 28340 981 12691 21479 20843 13776 4736 15557 9002 3533 19486 20335 8161 8140 2811 3214 29351 9045` 

我尝试使用 java 语言的 Queue 来解决这个问题,下面是我的代码。 它工作正常。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

class Dhoom4 {
    public static void main(String args[] ) throws Exception {
        //Read input from stdin and provide input before running
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
        String value[] = line.split(" ");
        int Skey = Integer.parseInt(value[0]);
        int Lkey = Integer.parseInt(value[1]);
        line  = br.readLine();
        int N = Integer.parseInt(line);
        int all_key[] = new int[N];
        line  = br.readLine();
        String temp[] = line.split(" ");
        int k=0;
        for(String s : temp)
            all_key[k++] = Integer.parseInt(s);
        
        //actual code
        Queue q = new LinkedList();
        q.add(Skey);
        //For getting answer
        int ans[] = new int[100005];
        for(int i=0;i<ans.length;i++)
            ans[i] = -1;
        ans[Skey] = 0;
        while(!q.isEmpty()){
            int x = (int) q.poll();
            if(x==Lkey)
                break;
            for(int i=0;i<k;i++){
                int y = all_key[i];
                y = (y*x);
                y = y%100000;
                if( y>=0 )
                {
                    if(ans[y]==-1){
                    ans[y] = ans[x]+1;
                    q.add(y);}
                }
             }  
            }
        System.out.println(ans[Lkey]);
    }
}

很抱歉,您的方法过于简单。 “模数 100000”约束使这成为一个无法通过单个循环解决的难题。

如果您使用的不仅仅是一些微不足道的数字来测试您的算法,您会更快地注意到这一点。 随机选出任意两个4位数字相乘; 例如

1234 * 5678 = 7006652

很明显,1234和5678是7006652的约数,但是1234和5678不是6652的约数。事实上,成功的keys是lock key的约数是很少见的巧合(当然除非乘积小于100000)。 那么为什么是下面这行代码呢?

if (a[i]<=100000L && lkey % a[i]==0)

注意两个键的条件都失败:

lkey % a[i] == 6652 % 1234 == 482 != 0
lkey % a[i] == 6652 % 5678 == 974 != 0

两把钥匙都不会被接受(Samarpit 持有的除外;但另一把除外)。

在调试器中尝试一下,您就会看到。 这是输入文件:

1234 6652
1
5678

底线是,你的算法不适合解决这个问题; 您将不得不采用完全不同的方法。

最直接的方法是生成所有可能的k键组合,从k = 1 开始并增加直到找到匹配项。 这可能不是最有效的方法,但它确实有效。 担心以后的优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM