【HDOJ】1050 moving tables

杭电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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值