杭电oj里的moving tables问题,可以用贪心算法解决。
记几个(我自己遇到的)易错点:
1.每次循环过后记得重定义ismoved为0.
2.对于两次搬运而言,上一次的end和下一次的begin相同时是可以搬到,没有重叠的走廊空间。
3.begin不一定小于end,他可能反着搬,即从房间序号大的搬到房间序号小的。
记一下AC代码
//Moving Tables
#include<stdio.h>
#include<algorithm>
struct table{
int begin;
int end;
int ismoved=0;//0表示暂未移动,1表示已移动
}table[200];
bool cmp(struct table a,struct table b)
{
return a.begin<b.begin;
}
bool isAllMoved(struct table *table,int n)
{
for(int i=0;i<n;i++)
{
if(table[i].ismoved==0)
return false;
}
return true;
}
//使ismoved变量初始为0
void return0(struct table *table,int n)
{
for(int i=0;i<n;i++)
{
table[i].ismoved=0;
}
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
int time=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&table[i].begin,&table[i].end);
if(table[i].begin>table[i].end)//反着
{
int k=table[i].begin;
table[i].begin=table[i].end;
table[i].end=k;
}
}
return0(table,n);
std::sort(table,table+n,cmp);
while(!isAllMoved(table,n))
{
int lastEnd=0;
for(int i=0;i<n;i++)
{
if((table[i].begin+1)/2 > (lastEnd+1)/2 && table[i].ismoved==0)
{
table[i].ismoved=1;
lastEnd=table[i].end;
}
}
time++;
}
printf("%d\n",time*10);
}
return 0;
}
266

被折叠的 条评论
为什么被折叠?



