[ACM_HDU_2037]今年の夏休みはACしない(欲張りアルゴリズム)


今年の夏休みは
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13173 Accepted Submission(s): 6807
Description「今年の夏休みはACじゃない?」
確かに、ワールドカップが来て、ファンの祝日も来て、多くのACMerもパソコンを捨てて、テレビに向かっていると思います.ファンとして、できるだけ多くの完全な試合を見たいと思っています.もちろん、新時代の良い青年として、あなたはきっと他の番組を見ます.例えば、ニュースの連播(国の大事に関心を忘れないでください)、非常に6+7、スーパー女子学生、王小娘の「楽しい辞書」など、あなたが好きなテレビ番組の中継スケジュールをすべて知っているとします.合理的に手配しますか?(できるだけ多くのフル番組が見られるのが目標)
Input入力データには複数のテストインスタンスが含まれており、各テストインスタンスの最初の行には整数n(n<=100)が1つしかなく、あなたが好きな番組の総数を表し、次いでn行データであり、各行には2つのデータTi_が含まれているs,Ti_e(1<=i<=n)は、i番目の番組の開始時間と終了時間をそれぞれ表し、問題を簡略化するために、各時間を正の整数で表す.n=0は入力終了を示し、処理を行わない.
Outputは、各テストインスタンスについて、完全に見えるテレビ番組の個数を出力し、各テストインスタンスの出力が1行を占める.
Sample Input 12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0
Sample Output 5
Source HDU2037
欲張りアルゴリズムを使用するには,まず一歩一歩の欲張りが最適な結果を得ることができることを証明しなければならない.タイトルの要求は完全な番組で、現在の番組が前の番組の時間と衝突してはいけないことを説明します.すなわち、現在の番組の開始時間は前の番組の終了時間以下であるべきです.では、私たちは一歩ごとに最も早く終了し、前の番組と衝突しない番組を探して、最終的に得られた結果はタイトルの解です.
#include<stdio.h>
#include<vector>
#include<iterator>
#include<algorithm>
using namespace std;
struct P{
	int s, e;
};
bool comp(const P &p1, const P &p2){
	return p1.e < p2.e;
}
int main(){
	int num;
	while(scanf("%d", &num) && num){
		vector<P> v;
		while(num--){
			P p;
			scanf("%d%d", &p.s, &p.e);
			v.push_back(p);
		}
		sort(v.begin(), v.end(), comp);
		int ans = 0, e = 0;
		for(vector<P>::iterator it = v.begin(); it != v.end(); ++it){
			if(e <= (*it).s){
				++ans;
				e = (*it).e;
			}
			//printf("%d %d
", (*it).s, (*it).e); } printf("%d
", ans); } return 0; }
 

======================= =======================
( ):http://www.clanfei.com/2012/04/785.html
, , , , 、 , , 。。
======================= =======================