UVA 10123 No Tipping

5 篇文章 0 订阅

应该说到目前为止这道题我还没有解决,纠结了很长时间。

感觉这道题如果用dfs的话,对于输入的处理是需要“运气”的,也就是排序时的依据是a.x*a.w<b.x*b.w还是a.counter1<b.counter1可能会对运行时间存在较大影响,应该是测试数据中存在特殊数据使得运行时间很长。下面的代码在zoj上可以0msAC,但在poj和uva上一个tle一个wa。我又使用了不“正当”的技巧tick。。总之这道题先放这里,等我掌握了dp再来一试。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n,a1,a2,a3,ok,visleft[20],visright[20],tick;
double l,w,lcounter1,lcounter2,lclockwise1,lclockwise2;
double ans[20][2];

struct node
{
	double x,w,counter1,counter2,clockwise1,clockwise2;
}right[20],left[20],mid[20];

int cmp1(node a,node b)
{
	return -a.x*a.w<-b.x*b.w;
}
int cmp2(node a,node b)
{
	return a.x*a.w<b.x*b.w;
}

int calcu()
{
	//printf("test");
	double a,b;
	int i;
	a=lcounter1,b=lclockwise1;
	for(i=0;i<a3;i++)
		b+=mid[i].clockwise1;
	for(i=0;i<a1;i++)
	{
		if(visleft[i]==1)
			a+=left[i].counter1;
	}
	for(i=0;i<a2;i++)
	{
		if(visright[i]==1)
			b+=right[i].clockwise1;
	}
	//printf("%lf %lf\n",a,b);
	if(a>b)
		return 0;
	a=lcounter2,b=lclockwise2;
	for(i=0;i<a3;i++)
		a+=mid[i].counter2;
	for(i=0;i<a1;i++)
	{
		if(visleft[i]==1)
			a+=left[i].counter2;
	}
	for(i=0;i<a2;i++)
	{
		if(visright[i]==1)
			b+=right[i].clockwise2;
	}
	if(a<b)
		return 0;
	return 1;
}

void dfs(int all,int which)
{
	tick++;
	if(tick>50000)
		return ;
	if(ok==1)
		return;
	int i,j;
	if(all==n)
	{
		ok=1;
		/*for(i=0;i<a1;i++)
		{
			//printf("%d\n",visleft[i]);
			if(visleft[i]==0)
			{
				//printf("a1\n");
				ans[n-1][0]=left[i].x;
				ans[n-1][1]=left[i].w;
			}
		}
		for(i=0;i<a2;i++)
		{
			//printf("%d\n",visright[i]);
			if(visright[i]==0)
			{
				//printf("a2\n");
				ans[n-1][0]=right[i].x;
				ans[n-1][1]=right[i].w;
			}
		}*/
		return ;
	}
	if(which==0)
	{
		//printf("test%d",all);
		for(i=0;i<a1;i++)
		{
			if(visleft[i]==0)
			{
				//printf("test%d",all);
				visleft[i]=1;
				if(calcu())
				{
					//printf("test%d",all);
					//printf("%d %lf %lf\n",all,left[i].x,left[i].w);
					ans[all][0]=left[i].x;
					ans[all][1]=left[i].w;
					dfs(all+1,0);
					if(ok==1)
						return ;
					visleft[i]=0;
				}
				else
				{
					visleft[i]=0;
					break;
				}
			}
		}
		for(i=0;i<a2;i++)
		{
			if(visright[i]==0)
			{
				visright[i]=1;
				if(calcu())
				{
					ans[all][0]=right[i].x;
					ans[all][1]=right[i].w;
					dfs(all+1,1);
					if(ok==1)
						return ;
					visright[i]=0;
				}
				else
				{
					visright[i]=0;
					break;
				}
			}
		}
	}
	else if(which==1)
	{
		for(i=0;i<a2;i++)
		{
			if(visright[i]==0)
			{
				visright[i]=1;
				if(calcu())
				{
					ans[all][0]=right[i].x;
					ans[all][1]=right[i].w;
					dfs(all+1,1);
					if(ok==1)
						return ;
					visright[i]=0;
				}
				else
				{	
					visright[i]=0;
					break;
				}
			}
		}
		for(i=0;i<a1;i++)
		{
			if(visleft[i]==0)
			{
				visleft[i]=1;
				if(calcu())
				{
					ans[all][0]=left[i].x;
					ans[all][1]=left[i].w;
					dfs(all+1,0);
					if(ok==1)
						return ;
					visleft[i]=0;
				}
				else
				{
					visleft[i]=0;
					break;
				}
			}
		}
	}
	//printf("test%d",all);
}

int main()
{
	int count=1,i,j,all;
	double a,b,help;
	while(scanf("%lf %lf %d",&l,&w,&n)&&n!=0)
	{
		a1=a2=a3=all=ok=tick=0;
		memset(visleft,0,80);
		memset(visright,0,80);
		lcounter1=lclockwise2=(l-3)*(l-3)/8/l*w;
		lcounter2=lclockwise1=(l+3)*(l+3)/8/l*w;
		for(i=0;i<n;i++)
		{
			scanf("%lf %lf",&a,&b);
			if(a>=-1.5&&a<=1.5)
			{
				mid[a3].x=a;
				mid[a3].clockwise1=(a+1.5)*b;
				//printf("%lf\n",(a+1.5)*b);
				mid[a3].clockwise2=0;
				mid[a3].counter1=0;
				mid[a3].counter2=(1.5-a)*b;
				//printf("%lf\n",(1.5-a)*b);
				mid[a3++].w=b;
			}
			else if(a<-1.5)
			{
				left[a1].x=a;
				left[a1].w=b;
				left[a1].counter1=-b*(a+1.5);
				//printf("%lf\n",-b*(a+1.5));
				left[a1++].counter2=-b*(a-1.5);
				//printf("%lf\n",-b*(a-1.5));
			}
			else if(a>1.5)
			{
				right[a2].x=a;
				right[a2].w=b;
				right[a2].clockwise1=b*(a+1.5);
				//printf("%lf\n",b*(a+1.5));
				right[a2++].clockwise2=b*(a-1.5);
				//printf("%lf\n",b*(a-1.5));
			}
		}
		sort(left,left+a1,cmp1);
		sort(right,right+a2,cmp2);
		//for(i=0;i<a1;i++)
		//	printf("%lf %lf\n",left[i].x,left[i].w);
		//for(i=0;i<a2;i++)
		//	printf("%lf %lf\n",right[i].x,right[i].w);
		for(i=0;i<a3;i++)
		{
			ans[all][0]=mid[i].x;
			ans[all++][1]=mid[i].w;
		}
		printf("Case %d:\n",count++);
		help=0;
		for(i=0;i<a3;i++)
		{
			help+=mid[i].clockwise1;
		}
		for(i=0;i<a2;i++)
		{
			help+=right[i].clockwise1;
		}
		for(i=0;i<a1;i++)
			if(left[i].counter1>help)
			{
				printf("Impossible\n");
				goto next;
			}
			help=0;
			for(i=0;i<a3;i++)
			{
				help+=mid[i].counter2;
			}
			for(i=0;i<a1;i++)
			{
				help+=left[i].counter2;
			}
			for(i=0;i<a1;i++)
				if(right[i].clockwise1>help)
				{
					printf("Impossible\n");
					goto next;
			}
		dfs(a3,0);
		if(ok==0)
		{
			tick=0;
			dfs(a3,1);
		}
		if(ok==0)
			printf("Impossible\n");
		else
		{
			for(i=n-1;i>=0;i--)
				printf("%.0lf %.0lf\n",ans[i][0],ans[i][1]);
		}
next:{}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值