专栏文章

题解:P14361 [CSP-S 2025] 社团招新 / club(民间数据)

P14361题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minfi601
此快照首次捕获于
2025/12/02 01:34
3 个月前
此快照最后确认于
2025/12/02 01:34
3 个月前
查看原文
考场30min才写出来。
这里说一个很唐诗大模拟的思路,先输入 x1,x2,x3x_1,x_2,x_3 表示第 ii 个人分别对 1,2,31,2,3 部门的满意度,再对 x1,x2,x3x_1,x_2,x_3 进行从大到小排序,用 pip_i 表示排序后 xix_i 在排序前的位置,并算排序后 x1x2x_1-x_2x2x3x_2-x_3 作为对这 nn 个人排序的关键字。
CPP
struct node{
    ll x[3],p[3],op,c;
}a[N];
inline bool cmp(node& x,node& y){
    return x.op>y.op||(x.op==y.op&&x.c>y.c);
}
inline bool cmp2(ll& x,ll& y){
    return x>y;
}
CPP
for(int ii=1;ii<=n;ii++){   //不要问我为什么是ii
    for(int i=0;i<=2;i++) cin>>a[ii].x[i],nx[i]=x[i];
    sort(a[ii].x,a[ii].x+3,cmp2);   //对x排序
    for(int i=0;i<=2;i++)
        for(int j=0;j<=2;j++)
            if(nx[j]==a[ii].x[i]) a[ii].p[i]=j;   //排序后在排序前序列的位置
    a[ii].op=a[ii].x[0]-a[ii].x[1];
    a[ii].c=a[ii].x[1]-a[ii].x[2];   //做差
}
sort(a+1,a+n+1,cmp);  //对每个人排序
然后从 11nn 对每个人进行具体的选择
CPP
for(int i=1;i<=n;i++){
    if(chosen[a[i].p[0]]<n/2){  //满意度最大的部门
        chosen[a[i].p[0]]++;
        ans+=a[i].x[0];
    }
    else if(chosen[a[i].p[1]]<n/2){   //第二的
        chosen[a[i].p[1]]++;
        ans+=a[i].x[1];
    }
    else{    //最差的
        chosen[a[i].p[2]]++;
        ans+=a[i].x[2];
    }
}cout<<ans<<endl;

评论

0 条评论,欢迎与作者交流。

正在加载评论...