簡體   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