求助玄关
  • 板块灌水区
  • 楼主ys_kylin__
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/1 08:56
  • 上次更新2023/11/3 06:38:47
查看原帖
求助玄关
924812
ys_kylin__楼主2023/8/1 08:56

学术没人,就在灌水发一下吧。

原题P7403

这道题六十分。我把能想到的数据都测了一遍甚至用了随机数测试,怎么测都没问题,大佬能看一下吗。。。

思路就是贪心的每一次取还能交最多朋友的人,最后判断是否完成目标(用vector存)

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node {int num,id;}g[1005];
int cmp(node x,node y) {return x.num>y.num;}
vector <int> ve[1005];
signed main(){
	int n;
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) {
		scanf("%lld",&g[i].num);
		if(g[i].num>=n) {printf("NO SOLUTION");return 0;}
		g[i].id=i;
	}
	sort(g+1,g+n+1,cmp);
	for(int i=1;i<=n;i++) {
		int cnt=1;
		int b=g[i].num-ve[g[i].id].size(),j=i+1;
		while(cnt<=b) {
			if(j>n) break;
			//printf("%d %d\n",i,g[j].id);
			if(ve[g[i].id].size()==g[i].num) break;
			if(ve[g[j].id].size()==g[j].num) {
				j++;
				continue;
			}
			//while(cnt[j]==g[j].num && j<=n) j++;
			//if(j==n+1) break;
			ve[g[i].id].push_back(g[j].id);
			ve[g[j].id].push_back(g[i].id);
			cnt++;
			j++;
		}
	}
	for(int i=1;i<=n;i++) {
		sort(ve[i].begin(),ve[i].end());
		if(ve[g[i].id].size()!=g[i].num) {
				printf("NO SOLUTION");
				return 0;
			}
	}
	printf("SOLUTION\n");
	for(int i=1;i<=n;i++) {
		for(int j=0;j<ve[i].size();j++) {
			printf("%lld ",ve[i][j]);
		}
		puts("");
	}
	return 0;
}
2023/8/1 08:56
加载中...