思路
贪心,两个操作如果有重叠,就一定不会同时进行,两者以任何顺序操作都不会影响到整体的时间。
所以每次操作时,任取一个并且将可以和他同时进行的操作一次完成,直到全部执行为止。在执行完一个操作后,假如下一个操作并没有和其他操作冲突,那执行必然对整体有利,假如有两个(多个)操作重叠,他们几个肯定不可能同时进行,所以任取一个都可以保证整体最优。
对于这道题还有应该需要注意的一点,这道题并不想其它题那样,直接按照序号大小就可以判断是否相互影响。 因为在走廊两边都有房间,相邻为 1 , 如 4, 5就合理,但 3, 4 就会冲突,所以应该对数据进行处理,比较简单的就是,将数据 + 1 或 - 1 再 / 2,就可以将类似 1, 2 奇偶对处理为等价。
代码
#include <algorithm>
#include <cstdio>
using namespace std;
struct node
{
int begin;
int end;
} op[410];
bool cmp(const node & a, const node & b)
{
return a.begin<b.begin;
}
int main()
{
int t, n;
int a, b;
int ans;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%d%d", &a, &b);
op[i].begin = (min(a, b)+1)/2;
op[i].end = (max(a, b)+1)/2;
}
sort(op, op+n, cmp);
ans = 0;
for(int i=0; i<n; i++)
{
if(op[i].begin>0)
{
op[i].begin = -1;
int cur = op[i].end;
for(int j=i+1; j<n; j++)
{
if(op[j].begin>cur)
{
op[j].begin = -1;
cur = op[j].end;
}
}
ans++;
}
}
printf("%d\n", ans*10);
}
return 0;
}