問題描述 有n(2≤n≤20)塊晶元,有好有壞,已知好晶元比壞晶元多。 每個晶元都能用來測試其他晶元。用好晶元測試其他晶元時,能正確給出被測試晶元是好還是壞。而用壞晶元測試其他晶元時,會隨機給出好或是壞的測試結果(即此結果與被測試晶元實際的好壞無關)。 給出所有晶元的測試結果,問哪些晶元是好晶元。 ...
問題描述 有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(並不表示該晶元對本身的測試結果。晶元不能對本身進行測試)。 輸出格式 按從小到大的順序輸出所有好晶元的編號 樣例輸入 3
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的時候不算數,所以在判斷這個晶元是否符合條件的時候,用的>而不是>=,如果在判斷的時候考慮進去,就加一個等號。