https://vjudge.net/contest/426531#problem/G
叠加问题
贪心算法之房间移动桌子问题
北面为200个奇数房间,南面为200个偶数房间,均是顺序排列,两个房间之间想要互相移动桌子,但是走廊的同一地方一次只能通过一个桌子,运一次十分钟
一开始的想法,是将所有对搬运房间按照右端点排序,再比较左端点。不过至今还没通过,过段时间回来检查。
贪心的写法,把所有能经过的房间都记录,找出其中通过遍数最多的房间,则是需要移动最多的时间,这其中奇数和偶数是相对应的,只要经过其中一个这段走廊都不可使用,所以奇偶放在一起,可以缩短一半时间
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct room
{
int l,r;
} o[201];
int main()
{
int t,n;
cin >> t;
while(t--)
{
cin >> n;
int sum=n,x,a[401]={0};
for(int i=0; i<n; i++)
{
cin>>o[i].l>>o[i].r;
if(o[i].l%2==0) o[i].l-=1;//因为偶数和奇数房间是对称的,所以全部转化到奇数的房间
if(o[i].r%2==0) o[i].r-=1;
if(o[i].r<o[i].l) swap(o[i].r,o[i].l);
for(int j=o[i].l;j<=o[i].r;j++)
a[j]++;//所有经历过的房间都记录
}
sort(a,a+401);
cout << a[400]*10 << endl;//找最大值
}
return 0;
}