NOJ1366:[ブルーブリッジカップ2018予選]複数の問題 - (思考)

タイトル説明

私たちは皆知っている、数はさらに数の倍数であるかどうかの計算で、特に優れたコンピューティングでエシャロットの学生の良い、など。 
しかし、多くの番号の後にある2つの数の唯一の良いエシャロット場合は、より困窮になります。 
Nエシャロットは今あなたに番号を与え、私はあなたがこの数nは数3を見つけることを願って 
3つの数字を作り、Kの倍数であり、最大と。データが解ける保証しました。 

エントリー

最初の行は、2つの正の整数N、Kを含みます
2行目のn個所与のnの数を表す正の整数。
1 <= N <= 10 ^ 5、1 <= K <= 10 ^ 3、 数nは以上8 ^ 10未満の所与。

輸出

Aは、出力線の整数を表し、尋ねます。

サンプル入力  のコピー

4 3
1 2 3 4

サンプル出力のコピー

9

思考:(と仮定は、3つの数字、B、Cである + B + C)%K =(%のK + B%のK + C%K)%K = 0。Kの定義<1000は、各数は三大モジュラス保持状況のそれぞれについて、3つまで取って、必ずしも<Kを法。しかし、また、状況モジュロ3人の裁判官の数が等しく、待ちたく作るために、すべてが等しくない、等しい2があります。モジュロモジュラスニーズかどうかを確認するために3つの数字のnum個の配列を持つレコードの数。質問9のグループは、実際に、以前のおかげで出てくることができるよう間隔がk回私モジュラスやアイデアを与えました。

輸入 java.utilの。* ;

輸入java.util.Collections。
 
パブリック クラスメイン{ // 1366:[ブルーブリッジカップ2018予選]複数の問題
    
    パブリック 静的 ボイドメイン(文字列[]引数){    
        スキャナのスキャン = 新しいスキャナ(System.in);
        
        INT [] [] = MOD 新しい新しい INT [1005] [3]; // 同じモジュラス保持トップスリー
        INT [] NUM = 新しい新しい INT [1005 ];
         int型 N- = scan.nextInt();
         int型 P = スキャン.nextInt();    
         のためのINT I = 1; I <= N; I ++ ){
             int型 X = scan.nextInt();
             INT R&LT X%= P。
            NUM [R&LT] ++ ;
             //は数の係数の最小値及び添字見つける
            INTミネソタ州= Integer.MAX_VALUEでは、
             INT IDX = 0 ;
             のためのINT J = 0; J <3; J ++ ){
                 IF(ミネソタ州> MOD [R&LT] [J]){
                    IDX = J;
                    ミネソタ州 = MOD [R] [J]。
                }
            }
            IF(ミネソタ州<X)// Xオリジナル、置換元のより大きい 
                MOD [R&LT] [IDX] = X。
            
        }

        長い MAXX = 0 ;
        以下のためのint型 I ++; I <P I = 0 
            Arrays.sort(MOD [I])。
        
        // 離散係数インデックスに配置されている暴力の最後の減算の二重数
        のためにINT I = 0; I <P; I ++ ){
             ためINT J = 0; J <P NUM && [I] =! 0; J ++ ){
                 長い今= 0 ;
                 int型 K = P - ((I + J)%のP);
                 IF(I && J == I == K){ // /モジュロ3と同じ
                    IF(NUM [I]> = 3  = MOD [I] [2] + MOD [I] [1] + MOD [I] [0 ]。    
                }  IF(&& J == I I!= K){ // 前モジュロ二つの同一の
                    IF(NUM [I]> = 2 && NUM [K]> = 1  = MOD [I] [2] + MOD [I] [1] + MOD [K] [2 ]。
                    
                }  IF(I!&& J = J == K){ // モジュロ二つの同一の
                    IF(NUM [I]> 1 && NUM = [J]> = 2  = MOD [I] [2] + MOD [J] [2] + MOD [J] [1 ]。
                }  IF(K == I I &&!= J){ // 第一及び第三の同じ
                    IF(NUM [I]> = 2 && NUM [J]> = 1  = MOD [I] [2] + MOD [I] [1] + MOD [J] [2 ]。
                }  { // 三つの異なるモジュラスは、
                    IF(> NUM [I]> 1 && NUM = [J]。1 && NUM = [K]> = 1  = MOD [I] [2] + MOD [J] [2] + MOD [K] [2 ]。
                }
                もし(MAXX < 今)
                    MAXX = 今;
            }
        }
        System.out.println(MAXX)。
    }
}

 空が落ちないだろう、との仕事はハード叶う夢を。 - 大幅西

おすすめ

転載: www.cnblogs.com/shoulinniao/p/12387679.html