問題描述
有n(2≤n≤20)塊芯片,有好有壞,已知好芯片比壞芯片多。
每個芯片都能用來測試其他芯片。用好芯片測試其他芯片時,能正確給出被測試芯片是好還是壞。而用壞芯片測試其他芯片時,會隨機給出好或是壞的測試結果(即此結果與被測試芯片實際的好壞無關)。
給出所有芯片的測試結果,問哪些芯片是好芯片。
每個芯片都能用來測試其他芯片。用好芯片測試其他芯片時,能正確給出被測試芯片是好還是壞。而用壞芯片測試其他芯片時,會隨機給出好或是壞的測試結果(即此結果與被測試芯片實際的好壞無關)。
給出所有芯片的測試結果,問哪些芯片是好芯片。
輸入格式
輸入數據第一行為一個整數n,表示芯片個數。
第二行到第n+1行為n*n的一張表,每行n個數據。表中的每個數據為0或1,在這n行中的第i行第j列(1≤i, j≤n)的數據表示用第i塊芯片測試第j塊芯片時得到的測試結果,1表示好,0表示壞,i=j時一律為1(並不表示該芯片對本身的測試結果。芯片不能對本身進行測試)。
第二行到第n+1行為n*n的一張表,每行n個數據。表中的每個數據為0或1,在這n行中的第i行第j列(1≤i, j≤n)的數據表示用第i塊芯片測試第j塊芯片時得到的測試結果,1表示好,0表示壞,i=j時一律為1(並不表示該芯片對本身的測試結果。芯片不能對本身進行測試)。
輸出格式
按從小到大的順序輸出所有好芯片的編號
樣例輸入
3
1 0 1
0 1 0
1 0 1
1 0 1
0 1 0
1 0 1
樣例輸出
1 3
思路:已知好芯片數目比壞芯片數目多,而且當遇到一個好的芯片的時候,用壞芯片去檢測,有可能檢驗結果正確,有可能錯誤,而拿合格的芯片去檢測,則檢驗結果一定是合格,所以如果在檢驗一個芯片的時候,其他芯片表示1的個數大於芯片總數的一半,就可以說明這個正在被檢測的芯片是好的芯片。
1 #include<iostream> 2 3 using namespace std; 4 5 class chips 6 { 7 public: 8 int get_n() //獲取芯片個數 9 { 10 cin >> n; 11 return n; 12 } 13 14 int get_all_chips() //初始化原來所有芯片 15 { 16 for(int i=1;i<=n;i++) 17 { 18 for(int j=1;j<=n;j++) 19 { 20 cin>>all_chips[i][j]; 21 } 22 } 23 return 0; 24 } 25 26 int check_chips() //篩選出合格的芯片 27 { 28 for(int i=1;i<=n;i++) 29 { 30 for(int j=1;j<=n;j++) 31 { 32 if(all_chips[i][j]==1) 33 { 34 qualified_chips[j]++; 35 } 36 } 37 } 38 } 39 40 int print_qualified_chips() //輸出函數 41 { 42 int flag=0; //用flag來控制輸出格式 43 for(int i=1;i<=n;i++) 44 { 45 if(qualified_chips[i]>n/2) 46 { 47 if(flag==0) 48 { 49 cout << i; 50 flag=1; 51 } 52 else 53 { 54 cout<<" "<<i; 55 } 56 } 57 } 58 } 59 private: 60 int all_chips[21][21]; //所有芯片 61 int qualified_chips[21]={0}; //合格芯片 62 int n; 63 }; 64 65 int main(void) 66 { 67 chips chip; 68 chip.get_n(); 69 chip.get_all_chips(); 70 chip.check_chips(); 71 chip.print_qualified_chips(); 72 return 0; 73 }
注意:題目要求i=j的時候不算數,所以在判斷這個芯片是否符合條件的時候,用的>而不是>=,如果在判斷的時候考慮進去,就加一個等號。