問題の説明
「この夏、ACですか?」
「はい。」
「それで、あなたは何をしていますか?」
「ワールドカップを見て、ばか!」
「@#$%^&*%...」
確かに、ワールドカップがここにあり、ファンのお祭りですそれも来ており、多くのACMerもコンピュータを離れてテレビに行くと推定されています。
ファンとしては、できる限り多くの完全なゲームを見たいと思っています。もちろん、新時代の良き若者として、ニュース放送(全国のイベントを気にすることはありません)、非常に6 + 7、スーパーなど、他のいくつかの番組を間違いなく見ます。ガールズ、王小夜の「ハッピーディクショナリー」など、見たいテレビ番組の放送スケジュールはもうわかっていると思いますが、それなりの手配はしますか?(目標は、できるだけ多くの完全なプログラムを視聴することです)
入力
入力データには複数のテストインスタンスが含まれます。各テストインスタンスの最初の行には、監視するプログラムの総数を示す整数n(n <= 100)のみが含まれます。次に、n行のデータ、各行に2つのデータTi_sが含まれます。 Ti_e(1 <= i <= n)は、i番目のプログラムの開始時間と終了時間をそれぞれ表します。問題を簡単にするために、各時間は正の整数で表されます。n = 0は、入力が終了し、処理が行われないことを意味します。
出力
テストインスタンスごとに、完全に表示できるテレビ番組の数が出力され、各テストインスタンスの出力は1行を占めます。
入力例
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
出力例
5
著者
lcy
ソース
ACM期末試験(2006/06/07)
#include "stdio.h"
struct node {
int t1;
int t2;
};
int main() {
struct node a[105], temp;
int n, cnt = 1, i, k;
while (scanf("%d", &n) != EOF && n != 0) {
for (i = 0; i < n; i++) {
scanf("%d %d", &a[i].t1, &a[i].t2);
}
for (i = 0; i < n-1; i++) { //冒泡排序 先按结束时间排序,在结束时间相等时,再按开始时间晚的排序
for (k = 0; k < n - 1; k++) { //想让在一定时间内看更多的节目,就需要看节目时间最短的节目
if (a[k].t2 > a[k+1].t2) {
temp = a[k];
a[k] = a[k+1];
a[k+1] = temp;
}
if (a[k].t2 == a[k+1].t2) {
if (a[k].t1 < a[k+1].t1) {
temp = a[k];
a[k] = a[k+1];
a[k+1] = temp;
}
}
}
}
int t = a[0].t2;
for (i = 1; i < n; i++) { //下一个节目开始时间要在上一个节目结束时
if (a[i].t1 >= t) {
cnt++;
t = a[i].t2;
}
}
printf("%d\n", cnt);
cnt = 1;
}
return 0;
}
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
5
0
--------------------------------
Process exited after 1.603 seconds with return value 0
请按任意键继续. . .
トピック:限られた時間でほとんどの番組を視聴できます。当初は総合的な配慮はありませんでしたが、最初に出現した番組の時間は別の配列でマークされており、次の時間帯に点在していると完全に視聴できません。WAの場合、問題は最適解が考慮されないことです。これは貪欲アルゴリズムです。
アルゴリズム:貪欲なアルゴリズム。最初に終了時刻で並べ替え、同じ終了時刻がある場合は、開始時刻の遅い順に並べ替えを続けます(つまり、最短の期間が最初です)。