码迷,mamicode.com
首页 > 其他好文 > 详细

UESTC_握手 CDOJ 913

时间:2015-05-20 00:05:57      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

握手

Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

一群人参加了一次聚会,其中有一些人是好朋友。一对朋友见面后握手且仅握一次手,并且每个人不会和自己握手(废话!)。现在告诉你每个人一共握了几次手,请你判断是否存在一种朋友关系满足每个人的握手数。

Input

输入多组数据,第一行一个数T,表述数据组数。每组数据第一行输入一个数n,表示有n个人参加了聚会,下一行有n个数,didn ,di表示第i个人的握手数。 (1n105 ,输入的所有d之和不超过5×105

Output

存在这种朋友关系输出YES,反之NO

Sample input and output

Sample InputSample Output
3
3
0 1 1
3
2 2 2
3
1 1 1
YES
YES
NO

Source

2014 UESTC Training for Graph Theory
 
解题报告:
 即判断是否可图利用Havel-Hakimi定理即可,具体可百度...
 因为p的和不超过5 * 1e5 ,直接暴力模拟即可
 
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
const int maxn = 1e5 + 50;
int d[maxn];
multiset<int,greater<int> >s;
vector<int>temp;

int main(int argc,char *argv[])
{
  int Case;
  scanf("%d",&Case);
  while(Case--)
   {
         int n;
         scanf("%d",&n);
         s.clear();
         for(int i = 1 ; i <= n ; ++ i)
          {
             int u;
          scanf("%d",&u);
          s.insert(u);    
       }
      int ans = 1;
      for(int i = 1 ; i <= n ; ++ i)
       {
            set<int>::iterator it = s.begin();
            if (*it >= s.size() || *it < 0)
             {
                ans = 0;
             break;    
          }
         int tot = *it;
         temp.clear();
         s.erase(it);
         while(tot)
          {
               it = s.begin();
               temp.push_back((*it)-1);
               tot--;
               s.erase(it);
          }
         for(int j = 0 ; j < temp.size() ; ++ j)
          s.insert(temp[j]);
       }
      if (ans)
       printf("YES\n");
      else
       printf("NO\n");
   }
  return 0;
}

 

UESTC_握手 CDOJ 913

标签:

原文地址:http://www.cnblogs.com/Xiper/p/4515697.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!