明明自己怎么测都没问题,但就是三十分,麻烦看一下吧。。
思路:每一次取还能交最多朋友的人,最后判断是否完成目标(用vector存)
#include<bits/stdc++.h>
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];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&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++) {
for(int j=i+1;j<=g[i].num+i;j++) {
if(j>n || ve[g[i].id].size()==g[i].num) continue;
ve[g[i].id].push_back(g[j].id);
ve[g[j].id].push_back(g[i].id);
}
}
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("%d ",ve[i][j]);
}
puts("");
}
return 0;
}