1. 程式人生 > >【Commando War】【UVA - 11729】(思維+排序)

【Commando War】【UVA - 11729】(思維+排序)

題目:

     “Waiting for orders we held in the wood, word from the front never came By evening the sound of the gunfire was miles away Ah softly we moved through the shadows, slip away through the trees Crossing their lines in the mists in the fields on our hands and our knees And all that I ever, was able to see The fire in the air, glowing red, silhouetting the smoke on the breeze”

      There is a war and it doesn’t look very promising for your country. Now it’s time to act. You have a commando squad at your disposal and planning an ambush on an important enemy camp located nearby. You have N soldiers in your squad. In your master-plan, every single soldier has a unique responsibility and you don’t want any of your soldier to know the plan for other soldiers so that everyone can focus on his task only. In order to enforce this, you brief every individual soldier about his tasks separately and just before sending him to the battlefield. You know that every single soldier needs a certain amount of time to execute his job. You also know very clearly how much time you need to brief every single soldier. Being anxious to finish the total operation as soon as possible, you need to find an order of briefing your soldiers that will minimize the time necessary for all the soldiers to complete their tasks. You may assume that, no soldier has a plan that depends on the tasks of his fellows. In other words, once a soldier begins a task, he can finish it without the necessity of pausing in between.

Input

There will be multiple test cases in the input file. Every test case starts with an integer N (1 ≤ N ≤ 1000), denoting the number of soldiers. Each of the following N lines describe a soldier with two integers B (1 ≤ B ≤ 10000) & J (1 ≤ J ≤ 10000). B seconds are needed to brief the soldier while completing his job needs J seconds. The end of input will be denoted by a case with N = 0. This case should not be processed.

Output

For each test case, print a line in the format, ‘Case X: Y ’, where X is the case number & Y is the total number of seconds counted from the start of your first briefing till the completion of all jobs.

Sample Input

3

2 5

3 2

2 1

3

3 3

4 4

5 5

0

Sample Output

Case 1: 8

Case 2: 15

 

解題報告:題目大意就是有n個任務,然後每個任務都有自己的安排部署時間和員工執行任務的時間,問最長需要多久才可以讓工作全部完成。根據生活常識可以知道,咱們要把執行時間長的先安排下去,那麼最可以節省時間,因為安排下去之後,在前一任務的執行過程中,咱們可以繼續安排,只要記錄最長時間就可以,因為存在這個任務執行時間超級長,能比它之後的所有的任務的部署和執行時間都長。

ac程式碼:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;

const int maxn=1e5+1000;

struct node{
	int b;//部署時間
	int p;//執行時間
}num[maxn];

bool cmp(node a,node b)
{
	return a.p>b.p;
}//按照執行時間的降序排序
int main()
{
	int n;
	int kase=0;
	while(scanf("%d",&n)!=EOF&&n)
	{
		for(int i=0;i<n;i++)
		{
			scanf("%d%d",&num[i].b,&num[i].p);
		}
		sort(num,num+n,cmp);
		int sum=0,ans=0;
		for(int i=0;i<n;i++)
		{
			sum+=num[i].b;//依次部署的時間之和	
			ans=max(sum+num[i].p,ans);//每次部署之後加上該任務的完成時間,求最長的時間耗度。
		}
		
		//sum+=num[n-1].pa;
		printf("Case %d: %d\n",++kase,ans);
	}
}
/*
3
2 5
3 2
2 1
3
3 3
4 4
5 5
0
*/