hdu 2059 龟兔赛跑 动态规划

hdu 2059龟兔赛跑

终于过了 ~ 不容易啊

第一次方法错了,,然后很无奈的上网看了思路 ,我发誓在看见动态规划四个字之后就把网页关掉了 然后自己写。。

第一次的代码:

//hdu2059 龟兔赛跑 
//方法错 
#include<stdio.h>
int P[101]={0};
int flag[101];
main()
{
	int i,j,L,N,C,T,Vr,V1,V2;
	int x;                      //
	while(scanf("%d",&L)!=EOF)
	{
		scanf("%d%d%d%d%d%d",&N,&C,&T,&Vr,&V1,&V2);
		for(i=1;i<=N;i++) scanf("%d",&P[i]);P[0]=0,P[i]=L;
		
		x=(T*V1*V2)/(V1-V2);
		
		flag[0]=0;
		for(j=i=1;i<=N;i++)
		{
			if(P[i]-flag[j-1]<=x) continue;
											
			if(P[i]+C>=P[i]-x) continue;
				flag[j++]=P[i];
		}
		j--;
		if(flag[j]+x>=L) flag[j]=L;
		else{j++;flag[j]=L;}
		printf("x=%d\n",x);
		for(i=1;i<=j;i++) printf("%d ",flag[i]);printf("\n");
		float tt=(j-1)*T;
		printf("加油时间共%f\n",tt);
		for(i=1;i<=j;i++)
		{
			tt+=x/V1;
			tt+=(flag[i]-flag[i-1]-x)/V2;
			printf("%d~%d~%d  ",flag[i-1],flag[i-1]+x,flag[i]);
			printf("%f %f\n",(float)x/V1,(float)(flag[i]-flag[i-1]-x)/V2);
		}
		printf("tt=%f\n",tt);
		if(tt<L/Vr)
			printf("What a pity rabbit!\n");
		else
			printf("Good job,rabbit!\n");
	}
}


然后是动态规划

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define min(x,y) ((x>y)?y:x)
int main()
{
	int L,N,C,T,Vr,V1,V2,P[101];
	int i,j;
	float time,Min,dp[101];
	
	while(scanf("%d",&L)!=EOF)
	{
		scanf("%d%d%d%d%d%d",&N,&C,&T,&Vr,&V1,&V2);
		for(i=1;i<=N;i++) scanf("%d",&P[i]);P[0]=0,P[i]=L;
		
		for(i=1;i<=N+1;i++) dp[i]=100000000.0;
		for(i=1;i<=N+1;i++)
		{
			for(j=0;j<=i-1;j++)
			{
				if(P[i]-P[j]<=C) time=T+(P[i]-P[j])/V1;
				else time=T+C/V1+(P[i]-P[j]-C)/V2;
				if(j==0) time-=T;
				Min=dp[j]+ min( time , (P[i]-P[j])/V2 );
			//	printf("%d %d     Min=%.2f   \n",i,j,Min);
	 			if( dp[i]> Min) dp[i]=Min;
	 			
			}
			printf(" dp[%d]=%.2f\n",i,dp[i]);
		}
	//	printf("~%.2f   %.2f\n",dp[N+1],L/Vr*1.0);
		if(dp[N+1]<L/Vr*1.0)
			printf("What a pity rabbit!\n");
		else
			printf("Good job,rabbit!\n");
	}
	return 0;
}


这个还是是错误的代码

 

因为把速度,距离等应为浮点型的变量写成了整型 ,

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define min(x,y) ((x>y)?y:x)
int main()
{
//	int L,N,C,T,Vr,V1,V2,P[101];
	int i,j,N;
	float time,Min,dp[101],L,C,T,Vr,V1,V2,P[101];
	
	while(scanf("%f",&L)!=EOF)
	{
		scanf("%d%f%f%f%f%f",&N,&C,&T,&Vr,&V1,&V2);
		for(i=1;i<=N;i++) scanf("%f",&P[i]);P[0]=0;P[i]=L;
		
		for(i=1;i<=N+1;i++) dp[i]=100000000.0;dp[0]=0;
		for(i=1;i<=N+1;i++)
		{
			for(j=0;j<=i-1;j++)
			{
				if(P[i]-P[j]<=C) time=T+(P[i]-P[j])/V1;
				else time=T+C/V1+(P[i]-P[j]-C)/V2;
			//	printf("P[i]=%.2f P[j]=%.2f  time=%.2f\n",P[i],P[j],time);
				if(j==0) time-=T;
				
				Min=dp[j]+ min( time , (P[i]-P[j])/V2 );
			//	printf("time=%.2f dp[j]=%.2f  %d~%d     Min=%.2f   \n",time,dp[j],j,i,Min);
	 			if( dp[i]> Min) dp[i]=Min;
	 			
			}
		//	printf(" dp[%d]=%.2f\n",i,dp[i]);
		}
	//	printf("~%.2f   %.2f\n",dp[N+1],L/Vr*1.0);
		if(dp[N+1]<L/Vr*1.0)
			printf("What a pity rabbit!\n");
		else
			printf("Good job,rabbit!\n");
	}
	return 0;
}

ac……

你可能感兴趣的:(hdu 2059 龟兔赛跑 动态规划)