社区讨论
求 Hack & 求调
P13493【MX-X14-T3】心电感应参与者 3已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mdk2f5or
- 此快照首次捕获于
- 2025/07/26 17:46 7 个月前
- 此快照最后确认于
- 2025/11/04 03:41 4 个月前
错了 6 个点(5,6,9,11,15,17),找不出原因,思路就是暴力,考虑对于每一个人,求出 通过询问每一个特征值能够排除哪些人。然后贪心,每次选能够排除最多人的那个特征值。
CPP#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[30][30];
vector <int> v[30];
int solve(int k){
for(int i=1;i<=m;i++) v[i].clear();
for(int j=1;j<=m;j++){ //对于每一个特征值判断能够排除哪些人
for(int i=1;i<=n;i++){
if(i==k) continue;
//如果不相同就能排除这个人
if(a[i][j] != a[k][j]) v[j].push_back(i);
}
}
//目前已经排除的人数
int ans = 0;
//能够排除的最大人数 是哪一个特征值
int maxn = 0 , res = 0;
for(int i=1;i<=m;i++){
maxn = 0; res = 0;
for(int j=1;j<=m;j++){
if(v[j].size() > maxn){ //取最大的
maxn = v[j].size();
res = j;
}
}
ans += maxn;
//cout<<res<<"k ";
if(ans >= n - 1){ //如果排除了 n-1 个人,就确定了结果
return i;
}
//如果找到的最大值是 0,那么说明排除不了了
if(maxn == 0) return -1;
for(int j=1;j<=m;j++){ //否则去重,删除这些已经被排除的人
if(v[j].size() == 0 || j == res) continue;
for(int p = 0; p < v[res].size(); p++){
//cout<<"d";
for(int q = 0; q < v[j].size(); q++){
if(v[res][p] == v[j][q]){
v[j].erase(v[j].begin() + q);
break;
}
//cout<<"p";
}
}
}
//同样删除
v[res].clear();
}
return -1;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
if(n==1){
cout<<0;
return 0;
}
for(int i=1;i<=n;i++){
cout<<solve(i)<<" ";
}
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...