2008 ACM-ICPC世界总决赛试题分析4-7

4

#include<stdio.h>
#include<string.h>
#include<math.h>
const int maxn=105;
const int oo=1000000000;
int test,ncp,nroad,ncm1,confdist,startisect,endisect,startdir,i,j,k;
bool visit[360],chp[maxn];
int ans[1005],p[1005];
int marker[maxn][360],op[maxn][360],er[maxn][360],id[maxn][360],len[maxn][360];
int l1,l2,tot,pn;

bool init()
{
	int i,j,x,y,rx,ry,l;
	++test;
	scanf("%d%d%d%d%d%d%d",&ncp,&nroad,&ncm1,&confdist,&startisect,&endisect,&startdir);
	if(startisect==0)
		return false;
	memset(chp,0,sizeof(chp));
	for(i=1;i<=ncp;i++)
	{
		scanf("%d",&x);
		chp[x]=true;
	}
	memset(id,0,sizeof(id));
	for(i=1;i<=nroad;i++)
	{
		scanf("%d %d %d %d %d",&x,&y,&rx,&ry,&l);
		id[x][rx]=i;len[x][rx]=l;
		op[x][rx]=y;er[x][rx]=ry;
		id[y][ry]=i;len[y][ry]=l;
		op[y][ry]=x;er[y][ry]=rx;
	}
	for(i=1;i<=maxn;++i)
		for(j=0;j<=359;++j)
			marker[i][j]=oo;

	for(i=1;i<=ncm1;++i)
	{
		scanf("%d%d%d",&x,&y,&l);
		for(j=0;j<=359;++j)
			if(id[x][j]==y)
			{
				if(l<marker[x][j])
					marker[x][j]=l;
				if(len[x][j]-l<marker[op[x][j]][er[x][j]])
					marker[op[x][j]][er[x][j]]=len[x][j]-l;
			}
	}
	return true;
}

bool find(int &k,int &kdir,int &sum)
{
	int i,j,v,vdir,pre;
	sum=0;pn=0;v=k;vdir=kdir;
	while(1)
	{
		p[++pn]=id[v][vdir];
		if(marker[v][vdir]+sum<=confdist)
		{
			k=op[v][vdir];
			kdir=(er[v][vdir]+180)%360;
			sum+=len[v][vdir];
			return true;
		}
		if(len[v][vdir] + sum>confdist)
		{
			sum=confdist;
			return false;
		}
		sum+=len[v][vdir];
		pre=vdir;
		vdir=(er[v][vdir]+180)%360;
		v=op[v][pre];
		if(chp[v])
			return false;
		for(i=0;i<=180;++i)
		{
			if(i==180)
				return false;
			j=(vdir+i)%360;
			if(id[v][j]>0)
			{
				vdir=j;
				break;
			}
			j=(vdir+360-i)%360;
			if(id[v][j]>0)
			{
				vdir=j;
				break;
			}
		}
	}
	return false;
}

void work()
{
	int i,j,k,kdir,v,delta;
	k=startisect;
	kdir=startdir;
	l1=l2=tot=0;
	do
	{
		if(chp[k])
		{
			memset(visit,0,sizeof(visit));
			visit[(kdir+180)%360]=true;
			while(1)
			{
				v=-1;
				for(i=0;i<=180;++i)
				{
					j=(kdir+i)%360;
					if(id[k][j]>0 && !visit[j])
					{
						v=j;
						break;
					}
					j=(kdir+360-i)%360;
					if(id[k][j]>0 && !visit[j])
					{
						v=j;
						break;
					}
				}
				visit[v]=true;
				if(find(k,v,delta))
				{
					l1+=delta;
					l2+=delta;
					for(i=1;i<=pn;++i)
						ans[++tot]=p[i];
					kdir=v;
					break;
				}
				else
				{
					kdir=(v+180)%360;
					l2+=delta*2;
				}
			}
		}
		else
		{
			for(i=0;i<=180;++i)
			{
				j=(kdir+i)%360;
				if(id[k][j]>0)
				{
					l1+=len[k][j];
					l2+=len[k][j];
					ans[++tot]=id[k][j];
					kdir=(er[k][j] + 180)%360;
					k=op[k][j];
					break;
				}
				j=(kdir+360-i)%360;
				if(id[k][j]>0)
				{
					l1+=len[k][j];
					l2+=len[k][j];
					ans[++tot]=id[k][j];
					kdir=(er[k][j]+180)%360;
					k=op[k][j];
					break;
				}
			}
		}
	}while(k!=endisect);
	printf("Case %d:\n",test);
	printf("   Length of hare's route is %d\n",l1);
	printf("   Length of hound's search is %d\n",l2);
	printf("   Route:");
	for(i=1;i<=tot;++i)
		printf(" %d",ans[i]);
	printf("\n");
	printf("\n");
}

int main()
{
	test=0;
	while(init())
		work();
	return 0;
}

5

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int maxn=22;
const int maxways=30000;
int n,i,j,new_tot,nodes,last,node,cases,ans[maxways][maxn],new_ans[maxways][maxn];
int l[maxn*2],r[maxn*2],step[maxn];
char a[maxn];

void split(int node)
{
	int i,j,k,f;
	new_tot=0;
	for(i=0;ans[i][0];i++)
	{
		f=ans[i][node];
		for(j=f-1;j>(f-1)/2;j--)
			if(j<=ans[i][nodes])
			{
				for(k=0;k<nodes;k++)
				{
					if(k>=node)
						new_ans[new_tot][k]=ans[i][k+1];
					else
						new_ans[new_tot][k]=ans[i][k];
				}
				new_ans[new_tot][k]=j;
				new_ans[new_tot++][k+1]=f-j;
			}
	}
	nodes++;
	memcpy(ans,new_ans,new_tot*maxn*4);
	ans[new_tot][0]=0;
}

int main()
{
	while(scanf("%d",&n)&&n)
	{
		memset(l,0,sizeof(l));
		memset(r,0,sizeof(r));
		last=0;
		for(i=0;i<n;i++)
		{
			scanf(" %s",a);
			node=0;
			for(j=0;a[j];j++)
				if(a[j]=='0')
				{
					if(!l[node])
					{
						l[node]=++last;
						r[node]=++last;
					}
					node=l[node];
				}
				else
				{
					if(!r[node])
					{
						l[node]=++last;
						r[node]=++last;
					}
					node=r[node];
				}
		}
		i=0;
		j=0;
		node=0;
		nodes=0;
		ans[0][0]=100;
		ans[1][0]=0;
		while(i<=j)
		{
			if(l[step[i]])
			{
				split(node);
				step[++j]=r[step[i]];
				step[++j]=l[step[i]];
			}
			else
				node++;
			i++;
		}
		printf("Case %d: %d\n",++cases,new_tot);
	}
	return 0;
}

6

#include<stdio.h>
int L,n,i,j,k,cases;
long long Ans,t1,t2;
int main()
{
	cases=0;
	while(1)
	{
		scanf("%d",&L);
		if(!L)
			break;
		if(L<4||L%2)
		{
			printf("Case %d: 0\n",++cases);
			continue;
		}
		n=(L-4)/2;
		t1=(n+3)*(n+2)*(n+1)/6;
		t2=(n+3)*(n+2)*(n+1);t2=t2*n/24;
		Ans=t1+2*t2;
		printf("Case %d: %lld\n",++cases,Ans);
	}
}


7

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <iostream>
#include <iomanip>
using namespace std;
double a[11],c,u;
int n,i,t;

double f(double k)
{
	double b[22],r[11],s,x,y;
	int i,j;
	memcpy(r,a,sizeof(r));
	r[1]-=k;
	r[0]-=-k*c+u;
	memset(b,0,sizeof(b));
	for(i=0;i<11;i++)
		for(j=0;j<11;j++)
			b[i+j]+=r[i]*r[j];
	for(i=21;i;i--)
		b[i]=b[i-1]/i;
	s=0;
	x=1;
	y=1;
	for(i=1;i<22;i++)
	{
		x*=c;
		s+=b[i]*x;
		y=-y;
		s-=b[i]*y;
	}
	return s;
}

double g(double k)
{
	double b[22],r[11],s,x;
	int i,j;
	memcpy(r,a,sizeof(r));
	r[1]-=k;
	r[0]-=-k*c+u;
	memset(b,0,sizeof(b));
	for(i=0;i<11;i++)
		for(j=0;j<11;j++)
			b[i+j]+=r[i]*r[j];
	for(i=21;i;i--)
		b[i]=b[i-1]/i;
	s=0;
	x=1;
	for(i=1;i<22;i++)
	{
		x*=c;
		s+=b[i]*(1-x);
	}
	return s;
}

double h(double v)
{
	double p0,p1,p2,v0,v1,mf,mg;
	u=v;
	p0=f(-0.5);
	p1=f(0.5);
	p2=f(1.5);
	v0=p1-p0;
	v1=p2-p1;
	mf=f(v0/(v0-v1));
	p0=g(-0.5);
	p1=g(0.5);
	p2=g(1.5);
	v0=p1-p0;
	v1=p2-p1;
	mg=g(v0/(v0-v1));
	return mf+mg;
}

void work()
{
	double p0,p1,p2,v0,v1,bk;
	printf("Case %d: ",++t);
	p0=h(-0.5);
	p1=h(0.5);
	p2=h(1.5);
	v0=p1-p0;
	v1=p2-p1;
	u=v0/(v0-v1);
	p0=f(-0.5);
	p1=f(0.5);
	p2=f(1.5);
	v0=p1-p0;
	v1=p2-p1;
	bk=v0/(v0-v1);
	printf("%.3lf %.3lf",bk,-bk*c+u);
	p0=g(-0.5);
	p1=g(0.5);
	p2=g(1.5);
	v0=p1-p0;
	v1=p2-p1;
	bk=v0/(v0-v1);
	printf(" %.3lf %.3lf\n",bk,-bk*c+u);
}

int main()
{
	while(scanf("%d",&n)&&n)
	{
		memset(a,0,sizeof(a));
		for(i=n;i>=0;i--)
			scanf("%lf",&a[i]);
		scanf("%lf",&c);
		work();
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值