2007 ACM-ICPC世界总决赛试题分析1-3

1

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
const double pi=acos(-1.0);
double ans1,ans2,X,tmp;
int cases,n,i,j,th,x,y;
int point[11000][2];
double angle[31000];
int main()
{
	cases=0;
	while(1)
	{
		scanf("%d %d",&n,&th);
		if(n==0 && th==0)
			break;
		point[0][0]=point[0][1]=0;
		for(i=1;i<=n;i++)
			scanf("%d %d",&point[i][0],&point[i][1]);
		if(th==0)
		{
			printf("Case %d: Acceptable as proposed\n\n",++cases);
			continue;
		}
		for(i=0;i<n;i++)
		{
			x=point[i+1][0]-point[i][0];
			y=point[i+1][1]-point[i][1];
			if(x>0)
				angle[i]=acos(double(y/sqrt(double(x*x+y*y))));
			if(x<0)
				angle[i]=2*pi-acos(double(y/sqrt(double(x*x+y*y))));
			if(x==0&&y>0)
				angle[i]=0;
			if(x==0&&y<0)
				angle[i]=pi;
		}
		sort(angle,angle+n);
		if(angle[n-1]<=pi)
		{
			printf("Case %d: Acceptable as proposed\n\n",++cases);
			continue;
		}
		ans1=ans2=-1;
		for(i=0;i<n;i++)
		{
			X=pi*2-angle[i];
			tmp=angle[(i+n-1)%n]+X;
			if(0<=tmp&&tmp<=pi)
			{
				if(ans1<0||X<ans1)
					ans1=X;
			}

			X=angle[i]-pi;
			if(X<0)
				X+=pi*2;
			tmp=angle[(i+1)%n]-X;
			if(0<=tmp&&tmp<=pi)
			{
				if(ans2<0||X<ans2)
					ans2=X;
			}
		}
		printf("Case %d: ",++cases);

		if(ans1<0&&ans2<0)
			printf("Unacceptable\n\n");
		else
			if(ans1>=0&&(ans2<0||ans1<ans2+1e-6))
				printf("Acceptable after clockwise rotation of %.2lf degrees\n\n",ans1/pi*180);
			else
				printf("Acceptable after counterclockwise rotation of %.2lf degrees\n\n",ans2/pi*180);
	}
	return 0;
}


2

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
int n,m,i,t,d,l,r,B,x[1009],y[1009],mark[1009];

long long S,u,v;
unsigned long long g;

void gcd(int &d,int x)
{
	int z;
	d=labs(d);
	x=labs(x);
	while(x%d)
	{
		z=x%d;
		x=d;
		d=z;
	}
}

int main()
{
	while(scanf("%d%d",&n,&m)&&n)
	{
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&x[i],&y[i]);
			mark[i]=1;
		}
		for(i=0;i<n;i++)
		{
			l=(i+n-1)%n;
			r=(i+1)%n;
			u=x[l]-x[i];
			u*=y[r]-y[i];
			v=y[l]-y[i];
			v*=x[r]-x[i];
			if(u==v)
				mark[i]=0;
		}
		l=0;
		for(i=0;i<n;i++)
			if(mark[i])
			{
				x[l]=x[i];
				y[l++]=y[i];
			}
		n=l;
		for(i=1;i<n;i++)
		{
			x[i]-=x[0];
			y[i]-=y[0];
		}
		x[0]=0;
		y[0]=0;
		x[n]=0;
		y[n]=0;
		for(i=1;i<n;i++)
		{
			if(x[i])
				d=x[i];
			if(y[i])
				d=y[i];
		}
		
		for(i=1;i<n;i++)
		{
			gcd(d,x[i]);
			gcd(d,y[i]);
		}
		B=0;
		for(i=1;i<=n;i++)
		{
			x[i]/=d;
			y[i]/=d;
			r=x[i]-x[i-1];
			if(r!=0)
				gcd(r,y[i]-y[i-1]);
			else
				r=labs(y[i]-y[i-1]);
			B+=r;
		}
		S=0;
		for(i=0;i<n;i++)
		{
			u=x[i];
			u*=y[i+1];
			v=x[i+1];
			v*=y[i];
			S+=u-v;
		}
		if(S<0)
			S=-S;
		u=m;
		u*=m+1;
		u/=2;
		u*=m+m+1;
		u/=3;
		g=u;
		g*=S;
		v=m;
		v*=m+1;
		v/=2;
		v*=B;
		g=g-v+m+m;
		printf("Case %d: %llu\n",++t,g/2);
	}
	return 0;
}


3

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int n,i,j,x[101],y[101],mark[102],px,py,vl,vp,cases,ans;
double C,d,l,r,m,t,map[102][102],len[102];
double dis(double dx,double dy)
{
	return sqrt(dx*dx+dy*dy);
}

int cross(double xa,double ya,double xb,double yb,double xc,double yc,double xd,double yd)
{
	if(xa<xc&&xb<xc&&xa<xd&&xb<xd)
		return 0;
	if(ya<yc&&yb<yc&&ya<yd&&yc<yd)
		return 0;
	if(xa>xc&&xb>xc&&xa>xd&&xb>xd)
		return 0;
	if(ya>yc&&yb>yc&&ya>yd&&yb>yd)
		return 0;
	double cra,crb;
	cra=(xb-xa)*(yc-ya)-(yb-ya)*(xc-xa);
	crb=(xb-xa)*(yd-ya)-(yb-ya)*(xd-xa);
	if(cra*crb>0)
		return 0;
	cra=(xd-xc)*(ya-yc)-(yd-yc)*(xa-xc);
	crb=(xd-xc)*(yb-yc)-(yd-yc)*(xb-xc);
	if(cra*crb>0)
		return 0;
	return 1;
}

int in_shape(double ox,double oy)
{
	int i,c;
	c=0;
	for(i=0;i<n;i++)
		c+=cross(ox,oy,98765,43210,x[i],y[i],x[i+1],y[i+1]);
	return c&1;
}

int no_cross(double xa,double ya,double xb,double yb)
{
	int i;
	if(in_shape((xa+xb)/2,(ya+yb)/2))
		return 0;
	xa=xa*(1-1e-7)+xb*1e-7;
	ya=ya*(1-1e-7)+yb*1e-7;
	xb=xb*(1-1e-7)+xa*1e-7;
	yb=yb*(1-1e-7)+ya*1e-7;
	for(i=0;i<n;i++)
		if(cross(xa,ya,xb,yb,x[i],y[i],x[i+1],y[i+1]))
			return 0;
	return 1;
}

double best_path()
{
	double s,lx,ly,bl,tl;
	int i,j,bj;
	s=m*vl;
	s-=int(s/C)*C;
	for(i=0;i<n;i++)
	{
		if(s<map[i][(i+1)%n])
			break;
		s-=map[i][(i+1)%n];
	}
	d=map[i][(i+1)%n];
	lx=x[i]*(d-s)/d + x[(i+1)%n]*s/d;
	ly=y[i]*(d-s)/d + y[(i+1)%n]*s/d;
	if(no_cross(px,py,lx,ly))
		return dis(px-lx,py-ly);
	j=i;
	for(i=0;i<n;i++)
	{
		if(i==j||i==(j+1)%n||no_cross(lx,ly,x[i],y[i]))
		{
			map[n][i]=dis(lx-x[i],ly-y[i]);
			map[i][n]=map[n][i];
		}
		else
		{
			map[n][i]=-2;
			map[i][n]=-2;
		}
		if(no_cross(px,py,x[i],y[i]))
		{
			map[n+1][i]=dis(px-x[i],py-y[i]);
			map[i][n+1]=map[n+1][i];
		}
		else
		{
			map[n+1][i]=-2;
			map[i][n+1]=-2;
		}
		len[i]=1e9;
	}
	len[n]=1e9;
	len[n+1]=0;
	memset(mark,0,sizeof(mark));
	for(i=0;i<=n;i++)
	{
		bl=1e9;
		for(j=0;j<n+2;j++)
			if(!mark[j]&&len[j]<bl)
			{
				bl=len[j];
				bj=j;
			}
		mark[bj]=1;
		for(j=0;j<=n;j++)
			if(!mark[j]&&map[bj][j]>-1)
			{
				tl=bl+map[bj][j];
				if(tl<len[j])
					len[j]=tl;
			}
	}
	return len[n];
}

int main()
{
	while(scanf("%d",&n)&&n)
	{
		for(i=0;i<n+2;i++)
			for(j=0;j<n+2;j++)
				map[i][j]=-2;
		for(i=0;i<n;i++)
			scanf("%d%d",&x[i],&y[i]);
		x[n]=x[0];
		y[n]=y[0];
		C=0;
		for(i=0;i<n;i++)
		{
			d=dis(x[i]-x[i+1],y[i]-y[i+1]);
			C+=d;
			map[i][(i+1)%n]=d;
			map[(i+1)%n][i]=d;
		}
		for(i=0;i<n-2;i++)
			for(j=i+2;j<n;j++)
				if(no_cross(x[i],y[i],x[j],y[j]))
				{
					map[i][j]=dis(x[i]-x[j],y[i]-y[j]);
					map[j][i]=map[i][j];
				}
		scanf("%d%d%d%d",&px,&py,&vl,&vp);
		l=0;
		r=1e8;
		while(r-l>1e-8)
		{
			m=(l+r)/2;
			t=best_path()/vp;
			if(t<m)
				r=m;
			else
				l=m;
		}
		ans=int(m*60+0.5);
		printf("Case %d: Time = %d:%02d\n",++cases,ans/60,ans%60);
	}
	return 0;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值