HDU 2037 今年暑假不AC (貪心)
阿新 • • 發佈:2019-01-09
題目連結: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; }