题意:
在一个宾馆里把一个桌子从一个房间i移到房间j但是在移动的过程中房间i和房间j之间的走廊会被占用。每一次的移动需要10钟的时间,问把所有的桌子移动完毕至少需要多长时间。
思路:
这是一道贪心算法的题目,把每一个桌子的移动按起始房间编号排序(这里规定起始房间的编号小于目的房间的编号)
然后采取贪心策略,假设cur代表的是第cur个桌子的移动那么对于其他的桌子i只要i满足桌子i还没有被移动,并且桌子i的移动不会和桌子cur的移动造成冲突。那么这两个桌子就可以同时移动。以此类推扫描整个数组即可。下面是通过的代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 1000+10, inf = -100000;
typedef struct
{
int s, t;
}Node;
Node a[maxn];
bool visit[maxn];
bool cmp(Node x, Node y)
{
return x.s < y.s;
}
int max(int x, int y)
{
return x > y ? x : y;
}
int min(int x, int y)
{
return x < y ? x : y;
}
int main()
{
int T = 0;
int n = 0;
scanf("%d",&T);
a[0].s = a[0].t = inf;
while(T--)
{
scanf("%d",&n);
int x = 0, y = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d%d",&x,&y);
a[i].s = min(x,y);
a[i].t = max(x,y);
}
sort(a+1,a+n+1,cmp);
memset(visit,false,sizeof(visit));
int count1 = 0,ans = 0;
while(count1 < n)
{
ans += 10;
int k = 0;
for(int i = 1; i <= n; i++)
{
if(a[i].s%2 == 0)
{
if(!visit[i] && a[i].s-a[k].t > 1)
{
visit[i] = true;
count1++;k = i;
}
}
if(a[i].s%2)
{
if(!visit[i] && a[i].s > a[k].t)
{
visit[i] = true;
count1++; k = i;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}