説明
学校の小さな講堂では、毎日多くのアクティビティが行われますが、時間があると、これらのアクティビティの予定時刻が競合し、いくつかのアクティビティを選択して開催する必要があります。
Xiao Liuの仕事は、学校の小さな講堂でのアクティビティの手配です。1度に1つのアクティビティしか手配できません。今、シャオ・リウはいくつかの活動計画のスケジュールを持っています、
彼はできるだけ多くの活動をアレンジしたいと思っています。
入力
最初の行は整数m(m <100)で、テストデータのグループがm個あることを意味します。
テストデータの各グループの最初の行は整数n(1 <n <10000)です。これは、テストデータにn個のアクティビティがあることを意味します。
次のn行。各行には2つの正の整数Bi、Ei(0 <= Bi、Ei <10000)があり、それぞれi番目のアクティビティの開始時間と終了時間(Bi <= Ei)を表します。
出力
入力のグループごとに、スケジュールできるアクティビティの最大数を出力します。
各グループの出力は1行を占めます
入力例
2
1 10
10 11
3
1 10
10 11
11 20
出力例
1
2
思考点:
STLでソートを適用することで、この問題を解決する方が便利です。アクティビティが終了する時間で昇順にソートし、次のアクティビティの開始時間と前のアクティビティの終了時間を判断して、差が大きい場合は比較します。 1の場合、カウントは1ずつ増加します。
#include<iostream>
#include<algorithm>
using namespace std;
struct meet
{
int start;
int end;
}a[100010];
bool cmp(meet a, meet b) //按会议结束时间排列
{
return a.end<b.end;
}
int main()
{
int n;
cin>>n;
for (int i = 1; i <= n; i++)
{
cin >> a[i].start;
cin >> a[i].end;
}
a[0].start = -1;
a[0].end = -1;
sort(a + 1, a + n + 1, cmp); //排列
int sum = 1;
int j = 1;
for (int i = 2; i <= n; i++) //从第二个会场开始从与前一个会场比较
{
if (a[i].start>a[j].end) //如果相隔时间大于1(输入都为整数),则活动数+1
{
j = i;
sum++;
}
}
cout << sum << endl;
system("pause");
return 0;
}
コード後の反映:
重要な点は依然として問題の変換であり、問題を合理的に変換する必要があるため、問題をはるかに簡単に解決できます。