2016-09-20 9 views
-27
  1. 私はこれで間違っている何が起こっているかを教えてください
  2. を発生し、実行時エラーを示しているエラー
  3. を確認してください。 https://www.hackerrank.com/contests/101hack41/challenges/washing-plates

    Javaコードのコンパイルの問題

  4. エラー:

    Exception in thread "main" java.util.NoSuchElementException 
        at java.util.Scanner.throwFor(Scanner.java:862) 
        at java.util.Scanner.next(Scanner.java:1485) 
        at java.util.Scanner.nextInt(Scanner.java:2117) 
        at java.util.Scanner.nextInt(Scanner.java:2076) 
        at Plates.main(Plates.java:17) 
    
  5. コード -

  6. この

  7. は問題[洗濯板ハッカーランクの挑戦でした。

    import java.util.*; 
    
    public class Plates { 
    
        public static void main(String[] args) { 
         Scanner in = new Scanner(System.in); 
         //System.out.println("Enter Details"); 
         String s = in.next(); 
         int l = s.length(); 
         int n = s.charAt(0); 
         int k = s.charAt(l - 1); 
         int arr[][] = new int[n][2]; 
         for(int i = 0; i < n; i++) { 
          for(int j = 0; j < 2; j++) { 
           arr[i][j] = in.nextInt(); 
          } 
         } 
         int max = 0; 
         int inc[] = new int[n]; 
         int ded[] = new int[n]; 
         for(int t = 0; t < n; t++) { 
          for(int p = 0; p < 2; p++) { 
           if(p == 0) { 
            inc[t] = arr[t][p]; 
           } else if(p == 1) { 
            ded[t] = arr[t][p]; 
           } 
          } 
         } 
         int a, b; 
         int sum = 0, loss = 0; 
         for(a = 0; a < n; a++) { 
          for(b = 1; b <= k; b++) { 
           sum = sum + inc[a + 1]; 
           loss = loss - ded[a + 1]; 
          } 
          if((sum - loss) > max) { 
           max = sum - loss; 
          } 
         } 
         System.out.println(max); 
        } 
    } 
    
+6

。実行時には失敗します。 – christopher

+2

何が起きているのかわかりませんが、スタックトレースが明示的にこの行に何が書かれていると思いますか? 'arr [i] [j] = in.nextInt(); ' – EpicPandaForce

+1

ソースには、例外に記載されている行 – hyde

答えて

4

HackerRankは言う:しかし

The first line contains two space-separated integers describing the respective values of n (the number of dirty plates) and k (the number of plates Harold has time to wash).

  • 1 <= n <= 20000, 1 <= k <= 20000

、あなたのコードは全く違う何かやっている:だけトークンを読み込み

String s = in.next(); 
int l = s.length(); 
int n = s.charAt(0); 
int k = s.charAt(l - 1); 

next()ので、sはなりをHackerRank値の文字列値n

7000 20000 

あなたのコードはn = '7'k = '0'を割り当て、その後、s7000を読み込みます:

はのは、最初の行があるとしましょう。

文字'7'はASCII/Unicodeの数値55を持ち、文字'0'は値48を持っています。実際にあなたが得たものはn = 55k = 48でした。あなたがやるべき何

は、単にこれです:

int n = in.nextInt(); 
int k = in.nextInt(); 

UPDATE

コンテストが終わったので、あなたが解決策を参照してくださいeditorial pageを読むことができます。 Javaにmultiset(順序付きリスト)はありませんが、PriorityQueueを使用できます。

以下は、高い値のkの場合のメモリフットプリントの低い代替ソリューションです。

まず、すべてのプレートを洗うことができると仮定して、すべてpの値を合計します。 k >= nの場合は完了です。さて、洗えないすべてのプレートについて、pをもう一度引いて、dを引きます。合計からp + dを減算します。

次に、最も高い値のp + dのプレートを洗浄することが目標です。したがって、合計値から小さな値を減算します。これを行うには、p + d値の配列を作成し、ソートし、最大値のkプレートをウォッシュ/除去/スキップします。

最後に、負の値を戻さないように注意してください。

は、ここでは、コンパクトな形である:それはコンパイルされ

java.util.Scanner in = new java.util.Scanner(System.in); 
int n = in.nextInt(), k = in.nextInt(), pd[] = new int[n]; 
long total = 0; 
for (int i = 0; i < n; i++) { 
    int p = in.nextInt(), d = in.nextInt(); 
    total += p; 
    pd[i] = p + d; 
} 
java.util.Arrays.sort(pd); 
for (int i = n - k - 1; i >= 0; i--) 
    total -= pd[i]; 
System.out.println(Math.max(0, total));