[ACM]積木分發

weixin_34304013發表於2010-03-28

Time Limit: 1000MS Memory Limit: 65535KB
Total Submissions: 539 Accepted: 52

Description:


歌手Pancakes到幼兒園跟小朋友玩,她到達的時候小朋友們正在爭積木,小朋友都想要更多的積木砌一個自己喜歡的圖形,砌完就可以和Pancakes合照。
同時,Pancakes手上還有一些積木,她可以把手上的這些積木全部給一個小朋友,然後等該小朋友砌完後就可以收回所發的積木和該小朋友原先手上的積木。
但她不知道能否讓所有的小朋友都和她合照,聰明的你可以幫助她麼?

Input:


輸入包括多個資料。
每個資料的第1行是兩個正整數n和s,n的範圍是[1,10000], s的範圍是[1,10000],表示一共有n位小朋友,Pancakes手上有s塊積木。以下有n行,每行有2個正整數,a和b,a和b的範圍是[1,10^9],表示第i個小朋友手上有a塊積木,還需要b塊積木才能夠砌完。
輸入n=0時表示結束。

Output:


如果可以讓所有小朋友都合照,就輸出"YES",否則,輸出"NO"。

Sample Input:


2 2
1 4
2 1
2 2
1 4
1 1
0 0

Sample Output:


YES
NO

Hint:


 

Source:


GDCPC

 

解答:

此題相對來說比較簡單,只要找大一個小孩需要積木數少於歌手手裡的積木數就可以給他,然後就可以收回給的積木數,並獲得小孩手裡的積木。此題並不需要去貪心,否則可能造成超時。程式碼如下:

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->#include <stdio.h>
#include 
<vector>
#include 
<algorithm>

using namespace std;

struct child
{
    
int own;
    
int less;
};

int child_cmp(const child& a, const child& b)
{
    
return a.less < b.less;
}

int main()
{
    
int n, s, i, can;
    vector
<child>::iterator it;
    
while(1)
    {
        scanf(
"%d%d"&n, &s);
        
if(n == 0)
            
break;

        vector
<child> cls;
        
for(i = 0; i < n; i ++)
        {
            child x;
            scanf(
"%d%d"&x.own, &x.less);
            cls.push_back(x);
        }
        can 
= true;
        make_heap(cls.begin(), cls.end(), child_cmp);
        sort_heap(cls.begin(), cls.end(), child_cmp);
        
for(it = cls.begin(); it != cls.end(); it ++)
        {
            
if(it->less <= s)
                s 
+= it->own;
            
else
            {
                can 
= false;
                
break;
            }
        }
        
if(can)
            printf(
"YES ");
        
else
            printf(
"NO ");
    }
    
return 0;
}

 

程式碼中用到了結構體,可能影響速度,可以改成兩個陣列來提高速度。排序演算法用的也是系統的堆排序。

相關文章