zoukankan      html  css  js  c++  java
  • hdu1205吃糖果(插空法)

    Problem Description

    HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。

    Input

    第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=1000000)。

    Output

    对于每组数据,输出一行,包含一个"Yes"或者"No"。

    Sample Input

    2
    3
    4 1 1
    5
    5 4 3 2 1

    Sample Output

    No
    Yes
    解题思路:这是一道排列问题,就是将若干种类的糖果按要求排列,相同种类的糖果不能相邻。这时考虑插空法。先考虑数量最多的那一种糖果(假设这种糖果有n个)先间隔排好,留出n-1个空格。剩下的糖果总数大于等于n-1,就可以使得数量最多的那一种糖果不会相邻,再将剩下的糖果按种类依次插入之前已经排好糖果的空隙中,则可以满足题目的要求,输出yes。如果剩下的糖果总数小于n-1,数量最多的那一种糖果一定会出现相邻的状况,因此输出no。因此,设数量最多的那一种糖果的数量为N,所有糖果总数为A,如果N-1<=A-N,即2N-1<=A,输出yes,否则输出no。

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 int main()
     5 {
     6     int T,N,m,maxnum;//插空法:用一种数目最多的进行排列,让剩下的数目依次插空
     7     LL sum;//规律:如果剩下的数目大于等于有maxsum-1这么多空,则yes,否则No
     8     cin>>T;
     9     while(T--){
    10         cin>>N;
    11         maxnum=sum=0;
    12         while(N--){
    13             cin>>m;
    14             sum+=m;
    15             maxnum=max(maxnum,m);//找出最大的数
    16         }
    17         if(sum-maxnum>=maxnum-1)cout<<"Yes"<<endl;
    18         else cout<<"No"<<endl;
    19     }
    20     return 0;
    21 }
    作者:霜雪千年
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Course Schedule II
    Vim笔记
    python programming
    暴风电视刷机教程
    python asyncio
    sqlalchemy lock and atomic
    rust学习(二)
    rust-vmm 学习(二)
    e3s10 网络管理
    打造VIM成为IDE - nerdtree
  • 原文地址:https://www.cnblogs.com/acgoto/p/8466379.html
Copyright © 2011-2022 走看看