题目大意:中文
注释代码:
/*
* Problem ID : NPU 1205 活动安排
* Author : Lirx.t.Una
* Language : C++
* Run Time : 106 ms
* Run Memory : 3544 KB
*/
#include <algorithm>
#include <iostream>
#include <utility>
#include <cstdio>
//maximum number of activities
//活动的最大数量
#define MAXACTN 1000
using namespace std;
pari<char, char> act[MAXACTN];
//活动时间为0-24因此可以用char保存
//该结构为偶序对,让两个一一对应的数作为一个整体表示一个元素
//可以利用sort算法以偶序中第一个元素从小到大的方式对偶序进行排列
//在<Utility>中
int
main() {
int n;//活动总数
int i;//计数变量
int b, e;//begin、end,用于临时存放每次输入的起始时间和结束时间
int prv_end;//上一个活动的结束时间
int ans;//最后可以参加的活动的总数也是题目的解
scanf("%d", &n);
for ( i = 0; i < n; i++ ) {
//这里将结束时间作为偶序的第一个元素
//贪心选择就是按照结束时间从小到大对所有活动排序
scanf("%d%d", &b, &e);
act[i].first = e;
act[i].second = b;
}
sort(act, act + n);//排序
//初始化
ans = 0;
prv_end = 0;
for ( i = 0; i < n; i++ )
if ( act[i].second >= prv_end ) {//如果当前活动开始时间≥上一个活动的结束时间
//则可以将该活动纳入
ans++;
prv_end = act[i].first;
}
printf("%d\n", ans);
return 0;
}
无注释代码:
#include <algorithm>
#include <iostream>
#include <utility>
#include <cstdio>
#define MAXACTN 1000
using namespace std;
pair<char, char> act[MAXACTN];
int
main() {
int n;
int i;
int b, e;
int prv_end;
int ans;
scanf("%d", &n);
for ( i = 0; i < n; i++ ) {
scanf("%d%d", &b, &e);
act[i].first = e;
act[i].second = b;
}
sort(act, act + n);
ans = 0;
prv_end = 0;
for ( i = 0; i < n; i++ )
if ( act[i].second >= prv_end ) {
ans++;
prv_end = act[i].first;
}
printf("%d\n", ans);
return 0;
}