今年暑假不ACTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 76581 Accepted Submission(s): 41083 Problem Description “今年暑假不AC?”
Input 输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
Output 对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
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
|
典型的贪心思想,我只要按结束时间排一个序就行。
# include <iostream>
# include <algorithm>
using namespace std;
/*
算法思想:用begin[i],end[i]表示起始和结束位置,然后a1.end <= a2.begin<a2.end <= a3.begin < a3.end.....
*/
const int maxn = 105;
struct node
{
int start, end;
};
bool cmp(struct node a, struct node b)
{
return a.end < b.end;
}
int main(int argc, char *argv[])
{
int n;
while(cin >> n, n)
{
struct node s[maxn];
for(int i = 0; i < n; i++)
{
cin >> s[i].start >> s[i].end;
}
sort(s, s + n, cmp);
int sum = 0, flag,f;
for(int i = 0; i < n; i++)
{
if(s[i].start < s[i].end)
{
sum++;
f = i;
flag = i;
break;
}
}
int maxx = 0;
for(int i = f + 1; i < n; i++)
{
if(s[flag].end <= s[i].start)
{
sum++;
flag = i;
}
}
cout << sum<< endl;
}
return 0;
}