题目大意:给出一些顶点的度,判断这些顶点是否能构成图。
解题思路:先将这些顶点的度按照从大到小排序,先从最大的开始,如果最大的度为x,那么可以假设之后的x个数表示的顶点都与最大的度的顶点相连,所以去掉最大的度的顶点,其后x个顶点的度都应该减一,例如假设给定4个顶点,他们的度依次为2,1,1,1。去掉2,其后 的两个数都减1,变成了0,0,1;再从大到小排序,1,0,0,重复之前的操作,变成-1,0;过程中一旦出现负数,则表示这些点不能构成图。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int n;
cin>>n;
int a[1000];
while(n--)
{
int b,i;
cin>>b;
for(i=0;i<b;i++)
cin>>a[i];
sort(a,a+b,cmp);
for(i=0;i<b;i++)
{
int j=a[i];
a[i]=0;
for(int k=i+1;k<=j+i;k++)
a[k]--;
sort(a+i+1,a+b,cmp);
if(a[b-1]<0)
break;
}
if(a[b-1]<0)
cout<<"no"<<endl;
else
cout<<"yes"<<endl;
}
return 0;
}
遇到的问题:忘记了每循环一次都要将新的数重新进行从大到小排序。