原题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;
}