题目的意思就是给你n个点,然后给出每个点的度数,问能不能构成图;
首先我们把点的度数从大到小排序,然后看看最大的度数是几,假如是k,那如果剩下的没有k个点,就不能构成图,有的话度数大的接下k个点度数都减一,如果有度数变为负数了,那也不能构成。然后除掉第一个点,剩下的排序,重复上面的步骤,到最后一个点,如果度数是0那就对了,不是的话也不能构成图;
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
const int maxn = 10005;
int arr[maxn];
int cmp(int a, int b) {
return a>b;
}
int main() {
int i,j;
while(scanf("%d", &n)!=EOF && n) {
bool flag = false;
for(i=0; i<n; i++) {
scanf("%d", &arr[i]);
}
int count=0;
for(i=0; i<n; i++) {
sort(arr+i,arr+n,cmp);
count=0;
for(j=i+1; j<n; j++) {
if(arr[j]>0) {
arr[j]--;
count++;
}
if(count == arr[i]) break;
}
if(count != arr[i]) {
printf("Not possible\n");
flag = true;
break;
}
}
if(arr[n-1] != 0 && !flag) {
printf("Not possible\n");
continue;
}
if(!flag) printf("Possible\n");
}
return 0;
}