社区讨论

为啥题解码量都那么小,而我写了2000多字节

P14361[CSP-S 2025] 社团招新参与者 5已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhj8wvqe
此快照首次捕获于
2025/11/03 22:38
4 个月前
此快照最后确认于
2025/11/08 07:49
3 个月前
查看原帖
rt.
同样的贪心思路,为啥我会想到开6个优先队列,两个十分相似的结构体,和自己手工排序a数组后将结果存到b数组里面?
当我知道我在考场上想了一个半小时才做出一道黄题,并且代码量和别人做个蓝紫题一样时,感觉自己白活了。
下面是代码,如果有兴趣就赏脸看看吧。(本蒟蒻太菜,不喜勿喷)
CPP
#include<bits/stdc++.h>
#define ll long long
#define gc getchar
using namespace std;
const int N=100010;
void in(int &x){
	x=0;char c;
	while((c=gc())<'0'||c>'9');
	while(c>='0'&&c<='9')x=x*10+(c^48),c=gc();
}
int n,ans;
int a[N][4],b[N][4],c[N][4];
int cnt[4];
bool f[N];
struct n1{
	int v,id;
	bool operator < (const n1 x)const{
		return c[id][1]<c[x.id][1];
	}
};
priority_queue<n1>q1[4];
struct n2{
	int v,id;
	bool operator < (const n2 x)const{
		return c[id][2]<c[x.id][2];
	}
};
priority_queue<n2>q2[4];
int mian(){
	in(n);ans=0;
	for(int i=1;i<=n;++i){
		f[i]=0;
		for(int j=1;j<=3;++j)
			in(a[i][j]);
		if(a[i][1]>=a[i][2]){
			if(a[i][1]>=a[i][3]){
				b[i][1]=1;
				if(a[i][2]>=a[i][3])
					b[i][2]=2,b[i][3]=3;
				else
					b[i][2]=3,b[i][3]=2;
			}else{
				b[i][1]=3;
				b[i][2]=1;
				b[i][3]=2;
			}
		}else{
			if(a[i][1]>=a[i][3]){
				b[i][1]=2;
				b[i][2]=1;
				b[i][3]=3;
			}else{
				b[i][3]=1;
				if(a[i][2]>=a[i][3])
					b[i][1]=2,b[i][2]=3;
				else
					b[i][1]=3,b[i][2]=2;
			}
		}
		c[i][1]=a[i][b[i][1]]-a[i][b[i][2]];
		c[i][2]=a[i][b[i][2]]-a[i][b[i][3]];
	}
	for(int i=1;i<=3;++i){
		cnt[i]=0;
		while(!q1[i].empty())
			q1[i].pop();
	}
	for(int i=1;i<=n;++i){
		q1[b[i][1]].push((n1){a[i][b[i][1]],i});
	}
	for(int i=1;i<=3;++i){
		while(!q1[i].empty()&&cnt[i]<n/2){
			n1 t=q1[i].top();q1[i].pop();
			ans+=t.v;
			f[t.id]=true;
			++cnt[i];
		}
	}
	for(int i=1;i<=3;++i){
		while(!q2[i].empty())
			q2[i].pop();
	}
	for(int i=1;i<=n;++i)
		if(!f[i])
			q2[b[i][2]].push((n2){a[i][b[i][2]],i});
	for(int i=1;i<=3;++i){
		while(!q2[i].empty()&&cnt[i]<n/2){
			n2 t=q2[i].top();q2[i].pop();
			ans+=t.v;
			f[t.id]=true;
			++cnt[i];
		}
	}
	for(int i=1;i<=n;++i)
		if(!f[i])
			ans+=a[i][b[i][3]];
	return ans;
}
int main(){
//	freopen("club5.in","r",stdin);
//	freopen("club5.out","w",stdout);
	int T;
	for(in(T);T--;printf("%d\n",mian()));
	return 0;
}
常数大的离谱。

回复

4 条回复,欢迎继续交流。

正在加载回复...