社区讨论

85pts求调

学术版参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhphzkbl
此快照首次捕获于
2025/11/08 07:39
4 个月前
此快照最后确认于
2025/11/08 07:39
4 个月前
查看原帖
rt,考场写了一个极其抽象的贪心然后挂了
代码:
CPP
#include<bits/stdc++.h>

using namespace std;

//多测清空 

int t,n;

struct node{
	int x,y,z;
	bool operator <(const node &A)const{
		return x-max(y,z)>A.x-max(A.y,A.z);
	}
}a[100010];

int sum[4];

bool cmp(node a,node b){
	if(a.x!=b.x) return a.x>b.x;
	if(a.y!=b.y) return a.y>b.y;
	return a.z>b.z;
}

int need(node a){
	if(a.x>=a.y&&a.x>=a.z) return 1;
	if(a.y>=a.x&&a.y>=a.z) return 2;
	if(a.z>=a.x&&a.z>=a.y) return 3;
	return 0;
	/*
	if(a.x==a.y&&a.x==a.z) return 4;
	if(a.x==a.y) return 5;
	if(a.x==a.z) return 6;
	if(a.y==a.z) return 7;
	*/
}

priority_queue<node>q[4];

int ans;

int main(){
	
	//freopen("club5.in","r",stdin);
	
	freopen("club.in","r",stdin);
	freopen("club.out","w",stdout);
	scanf("%d",&t);
	while(t--){
		while(!q[1].empty()) q[1].pop();
		while(!q[2].empty()) q[2].pop();
		while(!q[3].empty()) q[3].pop();
		sum[1]=sum[2]=sum[3]=0;
		ans=0;
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
		}
		sort(a+1,a+1+n,cmp);
		for(int i=1;i<=n;i++){
			//printf("qwq %d\n",ans);
			int now=need(a[i]);
			int maxn=0;
			int qwq=0;
			
			if(sum[now]>=n/2){
				
				if(now==1){
					maxn=a[i].x;
					if(a[i].y>=a[i].z) qwq=a[i].y;
					else qwq=a[i].z;
				}
				if(now==2){
					maxn=a[i].y;
					if(a[i].x>=a[i].z) qwq=a[i].x;
					else qwq=a[i].z;
				}
				if(now==3){
					maxn=a[i].z;
					if(a[i].x>=a[i].y) qwq=a[i].x;
					else qwq=a[i].y;
				}
				node aaa=q[now].top();
				int ay=aaa.y,az=aaa.z,ax=aaa.x;
				
				//printf("aaaa %d %d %d\n",ax,ay,az);
				
				if(ay>=az){
					if(-ax+ay+maxn>qwq){
						ans+=(-ax+ay+maxn);
						q[now].pop();
						if(now==1) q[1].push((node){a[i].x,a[i].y,a[i].z});
						if(now==2) q[2].push((node){a[i].y,a[i].z,a[i].z});
						if(now==3) q[3].push((node){a[i].z,a[i].y,a[i].x});
					}
					else{
						ans+=qwq;
					}
				}
				else{
					if(-ax+az+maxn>qwq){
						ans+=(-ax+az+maxn);
						q[now].pop();
						if(now==1) q[1].push((node){a[i].x,a[i].y,a[i].z});
						if(now==2) q[2].push((node){a[i].y,a[i].z,a[i].z});
						if(now==3) q[3].push((node){a[i].z,a[i].y,a[i].x});
					}
					else{
						ans+=qwq;
					}
				}
			}
			
			
			else{
				sum[now]++;
				if(a[i].x>=a[i].y&&a[i].x>=a[i].z){
					ans+=a[i].x;
					q[now].push((node){a[i].x,a[i].y,a[i].z});
				}
				else if(a[i].y>=a[i].z&&a[i].y>=a[i].x){
					ans+=a[i].y;
					q[now].push((node){a[i].y,a[i].x,a[i].z});
				}
				else if(a[i].z>=a[i].x&&a[i].z>=a[i].y){
					ans+=a[i].z;
					q[now].push((node){a[i].z,a[i].x,a[i].y});
				}
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}
/*
3
4
4 2 1
3 2 4
5 3 4
3 5 1
4
0 1 0
0 1 0
0 2 0
0 2 0
2
10 9 8
4 0 0
*/

回复

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

正在加载回复...