社区讨论

求 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 条回复,欢迎继续交流。

正在加载回复...