类似于活动安排问题,只不过活动安排问题是一个时间里只能安排一个活动,它这个是一个时间里最多能安排两个活动
方法一样,按右端点升序排序,然后从前往后贪心就行,如果每个时间点能安排的活动数不一样,就是网络流或者二分图匹配了
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
using namespace std;
#define ll long long
#define mod 1000000009
#define maxn 105
#define maxm 10003
#define INF 0x3f3f3f3f
int p;
struct Node
{
int l, r;
};
Node party[105];
bool cmp(Node& a, Node& b)
{
return (a.r < b.r) || (a.r == b.r&&a.l < b.l);
}
int cnt[30];
int main()
{
//freopen("input.txt", "r", stdin);
int kase = 1;
while (scanf("%d", &p) != EOF)
{
if (p == 0)
break;
memset(cnt, 0, sizeof(int) * 30);
for (int i = 0; i < p; ++i)
{
scanf("%d%d", &party[i].l, &party[i].r);
}
sort(party, party + p, cmp);
int sum = 0;
for (int i = 0; i < p; ++i)
{
for (int j = party[i].l; j < party[i].r; ++j)
{
if (cnt[j] < 2)
{
++cnt[j]; ++sum; break;
}
}
}
printf("On day %d Emma can attend as many as %d parties.\n", kase, sum);
++kase;
}
//system("pause");
//while (1);
return 0;
}