UVA - 11729 Commando War ( 貪心 )


上面的是2種情況的示意圖,在"解釋"中會解釋

/*
思路:貪心

難度:一開始不太理解,畫圖以後發現並不難

解釋:
按照這個圖,首先需要明確的是,吩咐指令的時間肯定是連起來的,吩咐完一個人,立刻就去吩咐下一個人,這點,可見圖中粉色和藍色的區域,我自己畫圖時沒有完全對齊,但其實表示的意思就是,吩咐指令的行爲之間,是沒有時間間隔的

至於ans的更新,可以分爲兩種情況
1. 相比於第 i 個任務而言,第 (i+1) 個任務的完成時間確實更晚
(這個完成時間,考慮了2者開始時間、吩咐時間和執行時間的不同,也就是說,比較的就是在數軸上畫出的最終時間)
體現在圖中,就是棕色框的右邊界在紫色框右邊界的右邊

此時 ans 需要更新

2. 相比於第 i 個任務而言,第 (i + 1)個任務反而更早全部完成
也就是說,第 (i + 1) 個任務所用時間,相當於是已經被第 i 個任務的持續時間完全覆蓋了,而第 i 個任務的持續時間,我們又在上一個循環中判斷過了,該更新的也早就更新了

因而,此時的 ans 不需要更新

啓發:其實看着感覺比較難,但分情況畫個圖,發現其實也並不難...
*/ 

#include <iostream>
#include <algorithm>
#define rep(i, k, n) for (int i = k; i < (n); i++)
using namespace std;
const int N = 1e4 + 5;
struct soilder
{
	int B, J; //分別爲吩咐指令用時,和執行任務用時 
}s[N];
bool mycmp(soilder a, soilder b)
{
	return a.J > b.J; //將執行所需時間更久的排前面 
}
int n;
int main()
{
	int kase = 0;
	while (cin >> n && n)
	{
		rep(i, 0, n)
		cin >> s[i].B >> s[i].J;
			
		sort(s, s + n, mycmp);
		int ans = 0, tmp = 0;
		//ans用來計所有用時
		//tmp用來累計吩咐指令用時 
		rep(i, 0, n)
		{
			tmp += s[i].B;
			ans = max(ans, tmp + s[i].J);
		}
		cout << "Case " << ++kase << ": " << ans << endl;
	}
	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章