貪心-突擊戰(Commando War, UVa 11729)
阿新 • • 發佈:2019-02-13
題目:
你有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;
}