藍橋杯 ADV-133 演算法提高 彩票
問題描述
為豐富男生節活動,貴系女生設定彩票抽獎環節,規則如下:
1、每張彩票上印有7個各不相同的號碼,且這些號碼的取值範圍為[1, 33];
2、每次在兌獎前都會公佈一個由七個互不相同的號碼構成的中獎號碼;
3、共設定7個獎項,特等獎和一等獎至六等獎。兌獎規則如下:
特等獎:要求彩票上的7個號碼都出現在中獎號碼中;
一等獎:要求彩票上的6個號碼出現在中獎號碼中;
二等獎:要求彩票上的5個號碼出現在中獎號碼中;
……
六等獎:要求彩票上的1個號碼出現在中獎號碼中;
注:不考慮號碼出現的順序,例如若中獎號碼為23 31 1 14 19 17 18,則彩票12 8 9 23 1 16 7由於其中有兩個號碼(23和1)出現在中獎號碼中,所以該彩票中了五等獎。
輸入格式
第一行一個正整數n,表示彩票數量,第二行7個整數,表示中獎號碼,下面n行每行7個整數,描述n張彩票。
輸出格式
7個空格隔開的數字,第1個數字表示特等獎的中獎張數,第2個數字表示一等獎的中獎張數,第3個數字表示二等獎的中獎張數……第7個數字表示六等獎的中獎張數。
樣例輸入
3
1 2 3 4 5 6 7
11 12 13 14 15 16 17
12 13 14 15 16 17 18
樣例輸出
0 0 0 0 0 0 1
資料規模和約定
30%的資料n<=100;
70%的資料n<=1000;
100%的資料n<=100000。
*****提示:陣列定義為全域性變數,可以分配更多記憶體。*****
分析:1.m陣列標記中獎號碼,mt陣列標記彩票號碼
2.如果一個號碼在中獎號碼中出現多次,且彩票中也出現多次,要取他們的最小值,不能當成只中了一個號碼哦~
#include <iostream> using namespace std; int main() { int n, m[34] = {0}, a[10] = {0}; cin >> n; for (int i = 0; i < 7; i++) { int t; cin >> t; m[t]++; } while (n--) { int mt[34] = {0}, sum = 0; for (int i = 0; i < 7; i++) { int t; cin >> t; mt[t]++; } for (int i = 1; i <= 33; i++) sum += min(mt[i], m[i]); a[7 - sum]++; } for (int i = 0; i < 7; i++) { cout << a[i] << " "; } return 0; }ofollow,noindex" target="_blank">❤❤點選這裡 -> 訂閱PAT、藍橋杯、GPLT天梯賽、LeetCode題解離線版❤❤
