2004 ACM-ICPC世界总决赛试题分析4-8

5

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n,m,i,j,a,b,cases,no_quotes,st[101],ed[101];
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
char c[147000];
int leap(int y)
{
	return y%400==0||y%4==0&&y%100;
}

void get_date(int day)
{
	int y,m;
	for(y=1700;day>365+leap(y);y++)
		day-=365+leap(y);
	for(m=1;day>days[m]+(m==2&&leap(y));m++)
		day-=days[m]+(m==2&&leap(y));
	printf("%d/%d/%d",m,day,y);
}

int f(int x)
{
	int i,tmp,sum;
	tmp=x/10000;
	sum=0;
	for(i=1700;i<tmp;i++)
	{
		sum+=365;
		if(leap(i))
			sum++;
	}
	tmp=x%10000/100;
	for(i=1;i<tmp;i++)
	{
		sum+=days[i];
		if(i==2&&leap(x/10000))
			sum++;
	}
	return sum+x%100;
}

void fill(int a,int b,int x)
{
	int fa,fb;
	fa=f(a);
	fb=f(b);
	memset(&c[fa],x,fb-fa+1);
}

int main()
{
	while(scanf("%d%d",&n,&m)&&n+m)
	{
		if(cases)
			printf("\n");
		memset(c,0,sizeof(c));
		for(i=0;i<n;i++)
			scanf("%d%d",&st[i],&ed[i]);
		for(i=0;i<m;i++)
		{
			scanf("%d%d",&a,&b);
			fill(a,b,2);
		}
		for(i=0;i<n;i++)
			fill(st[i],ed[i],1);
		printf("Case %d:\n",++cases);
		no_quotes=1;
		for(i=0;i<147000;i++)
			if(c[i]>1)
			{
				no_quotes=0;
				printf("    ");
				get_date(i);
				if(c[i+1]<2)
					printf("\n");
				else
				{
					printf(" to ");
					for(j=i;c[j]>1;j++);
					get_date(j-1);
					printf("\n");
					i=j;
				}
			}
			if(no_quotes)
				printf("    No additional quotes are required.\n");
	}
	return 0;
}

6

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct MAPS
{
	int n,m;
	char feature[110][110];
};
struct Merge
{
	int score,r,c;
};
char s[2000];
int cases,n,i,j,k,sum,max,x,y;
MAPS map[100];
Merge merge[100][100];
bool sign[100];
int calc(char a,char b)
{
	if(a=='-') return 0;
	if(b=='-') return 0;
	if(a==b) return 1;
	else return -10000;
}

int Max(int a,int b)
{
	if(a>b) return a;
	else return b;
}

int Min(int a,int b)
{
	if(a>b) return b;
	else return a;
}

Merge Try(int x,int y)
{
	int r,c,i,j,k,score,x1,y1,x2,y2;
	Merge tmp;
	tmp.score=0;
	for(r=-map[y].n+1;r<map[x].n;r++)
		for(c=-map[y].m+1;c<map[x].m;c++)
		{
			x1=Max(0,r);y1=Max(0,c);
			x2=Min(map[x].n,map[y].n+r);y2=Min(map[x].m,map[y].m+c);
			score=0;
			for(i=x1;i<x2;i++)
				for(j=y1;j<y2;j++)
					score+=calc(map[x].feature[i][j],map[y].feature[i-r][j-c]);
			if(score>tmp.score)
			{
				tmp.score=score;
				tmp.r=r;
				tmp.c=c;
			}
		}
	return tmp;
}

void add_map(int x,int y,int z)
{
	int i,j,k,Dx,Dy;
	Dx=Max(-merge[x][y].r,0);Dy=Max(-merge[x][y].c,0);
	map[z].n=Max(map[x].n,map[y].n+merge[x][y].r)+Dx;
	map[z].m=Max(map[x].m,map[y].m+merge[x][y].c)+Dy;
	for(i=0;i<map[z].n;i++)
		for(j=0;j<map[z].m;j++)
			map[z].feature[i][j]='-';
	for(i=0;i<map[x].n;i++)
		for(j=0;j<map[x].m;j++)
			map[z].feature[i+Dx][j+Dy]=map[x].feature[i][j];
	Dx+=merge[x][y].r;Dy+=merge[x][y].c;
	for(i=0;i<map[y].n;i++)
		for(j=0;j<map[y].m;j++)
			if(map[y].feature[i][j]!='-')
				map[z].feature[i+Dx][j+Dy]=map[y].feature[i][j];
}

int main()
{
	for(cases=1;;cases++)
	{
		scanf("%d",&n);
		if(n==0) break;
		for(i=1;i<=n;i++)
		{
			scanf("%d %d",&map[i].n,&map[i].m);
			for(j=0;j<map[i].n;j++)
			{
				scanf("%s",s);
				for(k=0;k<map[i].m;k++)
					map[i].feature[j][k]=s[k];
			}
		}
		for(i=1;i<=n;i++)
			for(j=i+1;j<=n;j++)
				merge[i][j]=Try(i,j);
		memset(sign,1,sizeof(sign));
		while(1)
		{
			max=0;
			for(i=1;i<=n;i++) if(sign[i])
				for(j=i+1;j<=n;j++) if(sign[j])
					if(merge[i][j].score>max)
					{
						max=merge[i][j].score;
						x=i;y=j;
					}
			if(max==0)
				break;

			sign[x]=sign[y]=0;
			n++;
			add_map(x,y,n);
			for(i=1;i<n;i++)
				if(sign[i])
					merge[i][n]=Try(i,n);
		}
		if(cases>1)
			printf("\n");
		printf("Case %d\n",cases);
		x=0;
		for(i=1;i<=n;i++)
			if(sign[i])
			{
				if(x)
					printf("\n");
				x++;
				printf("    MAP %d:\n",i);
				printf("    +");
				for(j=0;j<map[i].m;j++)
					printf("-");
				printf("+\n");
				for(j=0;j<map[i].n;j++)
				{
					printf("    |");
					for(k=0;k<map[i].m;k++)
						printf("%c",map[i].feature[j][k]);
					printf("|\n");
				}
				printf("    +");
				for(j=1;j<=map[i].m;j++)
					printf("-");
				printf("+\n");
			}
	}
	return 0;
}

7

#include<cstdio>
#include<cmath>
double t,x,y,ox[12],oy[12],r[12],px,py,dx,dy,dr,degree,ti,pi,dis,lx,ly,xa,ya,xb,yb;
int n,i,cases,c1,c2;

int check(double x,double y)
{
	int i;
	double dx,dy;
	for(i=0;i<n;i++)
	{
		dx=x-ox[i];
		dy=y-oy[i];
		dr=sqrt(dx*dx+dy*dy)-r[i];
		if(fabs(dr)>0.1)
			return 0;
	}
	return 1;
}

int main()
{
	pi=acos(-1.0);
	while(scanf("%d%lf%lf%lf",&n,&t,&x,&y)&&n)
	{
		for(i=0;i<n;i++)
		{
			scanf("%lf%lf%lf%lf",&px,&py,°ree,&ti);
			degree=(90-degree)/180*pi;
			dis=100*ti;
			ox[i]=px+dis*cos(degree);
			oy[i]=py+dis*sin(degree);
			r[i]=350*(t-ti);
		}
		printf("Trial %d: ",++cases);
		for(i=1;i<n;i++)
		{
			dx=ox[i]-ox[0];
			dy=oy[i]-oy[0];
			dr=r[i]-r[0];
			if(dx*dx+dy*dy+dr*dr>0.01)
				break;
		}
		if(i>=n)
		{
			puts("Inconclusive");
			continue;
		}
		dis=sqrt(dx*dx+dy*dy);
		if(dis<0.1)
		{
			puts("Inconsistent");
			continue;
		}
		lx=(dis*dis+r[0]*r[0]-r[i]*r[i])/dis/2;
		if(fabs(lx)>r[0]+0.1)
		{
			puts("Inconsistent");
			continue;
		}
		if(lx>r[0])
			lx=r[0];
		if(lx<-r[0])
			lx=-r[0];
		ly=sqrt(r[0]*r[0]-lx*lx);
		dx/=dis;
		dy/=dis;
		xa=ox[0]+dx*lx-dy*ly;
		ya=oy[0]+dy*lx+dx*ly;
		xb=ox[0]+dx*lx+dy*ly;
		yb=oy[0]+dy*lx-dx*ly;
		if(sqrt((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))<0.1)
		{
			xb=1e9;
			yb=1e9;
		}
		c1=check(xa,ya);
		c2=check(xb,yb);
		if(c1+c2==1)
		{
			if(c2)
			{
				xa=xb;
				ya=yb;
			}
			dx=x-xa;
			dy=y-ya;
			dis=sqrt(dx*dx+dy*dy);
			if(dis<0.1)
				puts("Arrived");
			else
			{
				if(dy>0)
					degree=acos(dx/dis);
				else
					degree=pi*2-acos(dx/dis);
				degree=90-degree/pi*180;
				if(degree<0)
					degree+=360;
				if(degree>360)
					degree-=360;
				printf("%.0lf degrees\n",degree);
			}
		}
		else
			if(c1)
				puts("Inconclusive");
			else
				puts("Inconsistent");
	}
	return 0;
}



8

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct line
{
	int x1,y1,x2,y2;
};
int cases,n,ans,s,i,j,k;
line a[110];
double b[200];
double len;

bool init()
{
	int i;
	scanf("%d",&n);
	if(n==0)
		return false;
	for(i=1;i<=n;i++)
		scanf("%d %d %d %d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
	return true;
}

double dis(double x,double y)
{
	return sqrt(x*x+y*y);
}

bool check(int x1,int y1,int x2,int y2,int x3,int y3)
{
	long long t1,t2;
	t1=(long long)x1*(long long)y2-(long long)x2*(long long)y1;
	t2=(long long)x1*(long long)y3-(long long)x3*(long long)y1;
	return ((t1>=0&&t2<=0)||(t1<=0&&t2>=0));
}

void cross(line A,line B)
{
	double A1,B1,C1,A2,B2,C2,x,y;
	A1=A.y2-A.y1;B1=A.x1-A.x2;C1=-(A.x1*A1 + A.y1*B1);
	A2=B.y2-B.y1;B2=B.x1-B.x2;C2=-(B.x1*A2 + B.y1*B2);
	x=-(C1*B2-C2*B1)/(A1*B2-A2*B1);
	y=-(A1*C2-A2*C1)/(A1*B2-A2*B1);
	b[s]=dis(x-a[i].x1,y-a[i].y1);
}

int main()
{
	cases=0;
	while(init())
	{
		ans=0;
		for(i=1;i<=n;i++)
		{
			s=2;
			b[1]=-25;
			b[2]=dis(a[i].x2-a[i].x1,a[i].y2-a[i].y1)+25;
			for(j=1;j<=n;j++)
				if(i!=j)
				if(check(a[i].x2-a[i].x1,a[i].y2-a[i].y1, a[j].x1-a[i].x1,a[j].y1-a[i].y1, a[j].x2-a[i].x1,a[j].y2-a[i].y1))
				if(check(a[j].x2-a[j].x1,a[j].y2-a[j].y1, a[i].x1-a[j].x1,a[i].y1-a[j].y1, a[i].x2-a[j].x1,a[i].y2-a[j].y1))
				{
					s++;cross(a[i],a[j]);
				}
				sort(b+1,b+s+1);
				for(j=1;j<s;j++)
				{
					len=b[j+1]-b[j];
					k=(int)(len/50);
					while(len-k*50>1e-6) k++;
					while(len-k*50<1e-6) k--;
					ans+=k;
				}
		}
		printf("Map %d\nTrees = %d\n",++cases,ans);
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值