1. 程式人生 > >HDU 2037 今年暑假不AC (貪心)

HDU 2037 今年暑假不AC (貪心)

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2037

水題,作為第一道貪心題練下手。

思路:貪心思想:只要每一步都選著佔用時間最小的同時要使剩餘時間最大的,也就是說,每回都要找一個結束最早的。當找到第一個後,一定要使剩餘的時間最長,以後每選一個都要考慮這個問題。這樣每一步都最優的話,結果也是最優的,可以用反證法證明。也就是按照結束時間小到大排序。

此類題結論:如果在可能的事件a1<a2<<an中選取在時間上不重疊的最長序列,那麼一定存在一個包含a1(結束最早)的最長序列。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

struct Point  
{  
    int s,e; 

    void get ()
    {
        scanf("%d%d",&s,&e);
    }

    bool operator < (const Point& _P) const  
    {  
        return e<_P.e||(e==_P.e&&s<_P.s);
    };
}data[105],temp;

int main ()
{
	int n;
	while (scanf("%d",&n) , n)
	{
		int i,num=1;
		for (i=0;i<n;i++)
			data[i].get();
		sort(data,data+n);
		temp=data[0];
		for (i=1;i<n;i++)
			if (data[i].s>=temp.e)
			{
				num++;
				temp=data[i];
			}
		printf("%d\n",num);
	}
	return 0;
}