7 条题解
-
0
xy xy sb sb zzl sb #include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int a[25][25]; int good[25]; int num=0; for(int i=0;i<n;i++) { int sum=0; for(int j=0;j<n;j++) { cin>>a[i][j]; if(a[i][j]==1) sum++; }
if(sum>n/2) good[num++]=i; } int newgood[25]={0}; for(int i=0;i<num;i++) { for(int j=0;j<n;j++) { if(a[good[i]][j]==1) newgood[j]++; } } for(int i=0;i<n;i++) if(newgood[i]>n/2) cout<<i+1<<" "; return 0;
}
-
0
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int a[25][25]; int good[25]; int num=0; for(int i=0;i<n;i++) { int sum=0; for(int j=0;j<n;j++) { cin>>a[i][j]; if(a[i][j]==1) sum++; }
if(sum>n/2) good[num++]=i; } int newgood[25]={0}; for(int i=0;i<num;i++) { for(int j=0;j<n;j++) { if(a[good[i]][j]==1) newgood[j]++; } } for(int i=0;i<n;i++) if(newgood[i]>n/2) cout<<i+1<<" "; return 0;
}
-
0
1)好的芯片比坏的多。
2)坏的芯片无论检查好的还是坏的,都是随机的0或1(50%)
3)芯片不能检查自己,i=j时结果统一为1。
这三个条件缺一不可,都会用到,汇聚成一句话:每个芯片都是被其他芯片检查过的,当芯片好的结果数 1>坏的结果数 0(或者说>(总数)/2),都说明芯片时好的,反正都是坏的。
我的理由如下:好的芯片比坏的多,说明好的芯片至少比坏的多 1,同时每轮结果里面都要去掉 i=j 时,如果坏的芯片检查时,结果都是0(其实50%),然后好的芯片恰比坏的多1,那么在这种极端的情况下 有效的结果 好的:坏的刚好是1:1,那么实际上得1的结果肯定会比得0的多。
还有要注意的:int half=n/2(得到的数并不是准确的一半,比如5/2=2),但是我们的条件是 >n/2(之前得到的结果数都是整数),就一定能保证大于一半。我可能说的比较拗口,但都是为了严格说明(芯片好的结果数 1>坏的结果数 0)的可行性。
3.AC代码
#include<iostream using namespace std; int main() { int n; cin>>n; int c=n/2; int b[n]={0}; int a[25][25]={0}; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>a[i][j]; if(a[i][j]==1)b[j]++; } } for(int i=0;i<n;i++)if(b[i]>c)cout<<i+1<<" "; return 0; }
-
-1
#include<iostream> #include<cstring> using namespace std; int a[100]; char b[100][100]; int main() { int n; cin>>n; int d=1; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>b[i][j]; } } for(int j=1;j<=n;j++) { long long c=0; for(int i=1;i<=n;i++) { if(b[i][j]=='1') { c++; } } if(c>(n-c)) { a[d]=j; d++; } } for(int i=1;i<d;i++) { cout<<a[i]<<" "; } }
- 1
信息
- ID
- 725
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 94
- 已通过
- 33
- 上传者