アルゴリズムは、宝くじを向上させます

リソースの制約
制限時間:メモリ制限が1.0S:256.0メガバイト
問題の説明
  :男性祭、雌部が設けられている高価な抽選を豊かにする、ルールは次の通りであり
  、7つの異なる番号に印刷された各宝くじ、1、およびこれらの数値範囲内にある、[1、33]
  それぞれ、2当選番号を付与する前に回からなる互いにA番号から7つの異なるによって発表される、
  図3に示すように、劉Dengjiangの7つの賞、大賞と最初の賞を設定しました。:次のようにDuijiangのルールはある
  大賞:リクエスト7数字がで当選番号宝くじに表示され、
  一等賞は:当選番号はで表示されます宝くじに6つの数字が必要です。
  二等賞:5つの数字は、宝くじの要件に表示されます当選番号で、
  ......
  劉Dengjiang:当選宝くじ番号1現れる請求項の数字;
  注:当選番号は2331114191718であれば順序は、例えば、数値で表示されない、宝くじ128 9231167によりこれに二つの数字(23 1)は、第五の賞ので抽選で当選番号で表示されがあります。
  李華を購入する番号と宝くじの当選番号の数は、彼の宝くじの大当たりを決定するプログラムを書いてくださいすることが知られています。
入力形式
  正の整数の最初の行のN、宝くじチケットの数、当選番号を表す7整数の2行目、整数N、抽選以下各行ライン7。
出力フォーマット
  7スペース区切られた数字は、最初の数は大賞を獲得の枚数を示し、最初の2つの数字は、最初の賞を受賞の枚数を示し、最初の3つの数字は7で第二入賞数を示し......当選番号は、シート劉Dengjiangの数を示しています。
サンプル入力
3
1 2 3 4 5 6 7
11 12 13 14 15 16 17
12 13 14 15 16 17 18
8 7 10 9 31 30 29
サンプル出力
0 0 0 0 0 0 1
スケールデータと規則
  n個のデータの30% - <= 100;
  データの70%N - <= 1000;
  100%のデータN <= 100000。

  *****注:配列をグローバル変数として定義され、あなたがより多くのメモリを割り当てることができます。*****
Aは考えた:暴力的な反復の配列を開きます
1の#include <stdio.hの>
 2  
3  INT lotteryNum [ 100000 ] [ 7 ] = { 0 }。
4  
5  INT メイン()
 6  {
 7      INT N。
8      INT prizeNumer [ 7 ] = { 0 }。
9      INT prizeYorN [ 7 ] = { 0 }。
10      int型I、J、K。
11  
12      のscanf(" %d個"、&N)
13      のために(私は= 0 ; I <7 ; I ++ 14      {
 15          のscanf(" %dの"、&prizeNumer [I])。
16      }
 17      のために(私は= 0 ; N I <; I ++ 18      {
 19          (J = 0 ; J < 7 ; J ++ 20          {
 21              のscanf(" %dの"、&lotteryNum [I] [J])。
22          }
 23      }
 24      
25      のために、私は=(0; I <N-; I ++)   // サイクルは、いくつかの抽選有する
26は、     {
 27          INT ANS = 0 ;
 28          (J = 0 ; J < 7。、J ++)   // 一つずつより
29          {
 30              (K = 0。 K < 7。 ; K ++)   // 各宝くじトラバース用
31である             {
 32                  IF(prizeNumer [J] == lotteryNum [I] [K])
 33は                 、{
 34である                      ANS ++ ;
 35                  }
 36              }
37          }
 38          スイッチ(年)
 39          {
 40          ケース 7:prizeYorN [ 0 ] + = 1 ;
41              ブレーク;
42          ボックス 6:prizeYorN [ 1 ] + = 1 ;
43              ブレーク;
44          ボックス 5:prizeYorN [ 2 ] + = 1 ;
45              ブレーク;
46          ボックス 4:prizeYorN [ 3 ] + = 1 ;
47              ブレーク;
48          ケース 3:prizeYorN [ 4 ] + = 1 ;
49              ブレーク;
50          ケース 2:prizeYorN [ 5 ] + = 1 ;
51              ブレーク;
52          ケース 1:prizeYorN [ 6 ] + = 1 ;
53          }
 54      }
 55  
56      のためには、式(I = 0 ; iが< 7 ; I ++ 57      {
 58          のprintf(" %dの"、prizeYorN [I])。
59      }
 60      リターン 0 61 }

2思考ん:大きな配列を開く必要があり、Fの配列全体を開く1に初期化した後、一度だけ宝くじを横断している、直接ルックアップテーブル、あれば何  F [i]を== 1、  SUM ++最後に、その後、そしてp [合計]カウントを使用し、逆出力P [和]。

ファイル名を指定して実行時の複雑さ2つのアイデアは、O(N)ですが、大幅に少ないメモリ使用量二アイデア。

 

 1 #include<stdio.h>
 2 
 3 int f[33], p[10], n, m;
 4 int main()
 5 {
 6     scanf("%d",&n);
 7     for (int i = 0; i < 7; i++)
 8     {
 9         scanf("%d", &m);
10         f[m] = 1;
11     }
12     for (int i = 1; i <= n; i++)
13     {
14         int sum = 0;//中奖号码数量
15         for (int j = 1; j <= 7; j++)
16         {
17             scanf("%d", &m);
18             if (f[m] == 1)
19                 sum++;
20         }
21         p[sum]++;
22     }
23     for (int i = 7; i >= 1; i--)
24         printf("%d", p[i]);
25     return 0;
26 }

 

 

 

おすすめ

転載: www.cnblogs.com/ZhengLijie/p/12652004.html