1. 程式人生 > >貪心-突擊戰(Commando War, UVa 11729)

貪心-突擊戰(Commando War, UVa 11729)

題目:

你有n個部下,每個部下需要完成一項任務。第i個部下需要你花Bi分鐘交待任務,然後他會立刻獨立地、無間斷地執行Ji分鐘後完成任務。你需要選擇交待任務的順序,使得所有任務儘早執行完畢(即最後一個執行完的任務應儘早結束)。注意,不能同時給兩個部下交待任務,但部下們可以同時執行他們各自的任務。

輸入包含多組資料,每組資料的第一行為部下的個數N( 1 ≤ N ≤ 1 000 ) ;以下 N 行每行兩個正整數 B 和 J(1≤B≤10 000,1≤J≤10 000),即交待任務的時間和執行任務的時間。輸入結束標誌為N=0。

對於每組資料,輸出所有任務完成的最短時間。

樣例輸入

3
2 5
3 2
2 1 3
3 3
4 4
5 5 0

樣例輸出

Case 1: 8
Case 2: 15

分析

1、題目比較簡單,使用貪心演算法。此題中,我們想要的情況定然是,希望有儘可能多的人在同時工作,希望一個人工作的同時能夠在給另一個人佈置任務。所以只要按照工作的時間從大到小排序即可。
2、定義結構體,存放各個部下佈置任務的時間和完成任務的時間。

程式碼:

#include <stdio.h>
#include <algorithm>
using namespace std;

struct NODE
{
    int give;
    int work;
} war[1005];

int
cmp(NODE x,NODE y) { if(x.work > y.work) return 1; return 0; } int main() { int n,cas = 1; while(scanf("%d",&n),n) { for(int i = 0; i<n; i++) scanf("%d%d",&war[i].give,&war[i].work); sort(war,war+n,cmp);//按照工作的時間排序 int ans = 0
,sum = 0; for(int i = 0; i<n; i++) { sum+=war[i].give; if(sum+war[i].work>ans)//可能會 先佈置任務的人還沒結束,後佈置任務的人已經結束 ans=sum+war[i].work; } printf("Case %d: %d\n",cas++,ans); } return 0; }