Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

NOTE:You may assume the answer fits in a signed 64-bit integer

Posted by 20053565 at 2008-06-09 14:47:05 on Problem 3377
In Reply To:哪位大牛帮忙说一下9月9号的月赛G题(3377)的思路,我思路貌似和Contest Report中一样,很郁闷!(附了我的源代码) Posted by:052565 at 2007-09-11 01:13:54
> 附我的源代码:
> #include <stdio.h>
> 
> #define N 1000005
> 
> typedef struct
> {
> 	long direction;
> 	long point;
> }node;
> 
> long str[2][N] = {0};
> long sum[N] = {0};
> long over[N] = {0};
> long l[N] = {0};
> 
> 
> long main()
> {
> 		
> 	long n,i,t;
> 	
> 	node start,end;/*定义起点终点结构*/
> 
> 	scanf("%ld",&n);/*输入当前规模*/
> 
> 	while(n)
> 	{
> 		scanf("%ld %ld %ld %ld",&start.direction,&start.point,&end.direction,&end.point);/*输入起点终点*/
> 
> 		for(i = 0;i < n;i ++)
> 			scanf("%ld",&str[0][i]);/*输入北面的码头间需要的时间*/
> 
> 		for(i = 0;i <= n;i ++)
> 			scanf("%ld",&over[i]);/*输入自西向东的过河所需要的时间*/
> 		
> 		for(i = 0;i < n;i ++)
> 			scanf("%ld",&str[1][i]);/*输入南面的码头间需要的时间*/
> 		
> 		if(start.point > end.point)/*如果起点在终点的东面,交换起点和终点*/
> 		{
> 			t = start.direction;
> 			start.direction = end.direction;
> 			end.direction = t;
> 
> 			t = start.point;
> 			start.point = end.point;
> 			end.point = t;
> 		}
> 		
> 		for(i = n - 1;;i --)/*将终点那条边替换为最短的*/
> 		{
> 			if(i < end.point)
> 				break;
> 			if(over[i] > over[i + 1] + str[0][i] + str[1][i])
> 				over[i] = over[i + 1] + str[0][i] + str[1][i];
> 		}
> 		for(i = 1;;i ++)/*将起点那条边替换为最短的*/
> 		{
> 			if(i > start.point)
> 				break;
> 			if(over[i] > over[i - 1] + str[0][i - 1] + str[1][i - 1])
> 				over[i] = over[i - 1] + str[0][i - 1] + str[1][i - 1];
> 		}
> 
> 		i = start.point;
> 		l[i] = over[i];/*l[i]表示从起点开始到对岸的第i个码头所要的最短时间*/
> 		sum[i] = 0;/*sum[i]表示从起点开始到起点同岸的第i个码头所要的最短时间*/
> 		for(i = i + 1;i <= end.point;i ++)/*动态规划求sum[i],l[i]*/
> 		{
> 			l[i] = l[i - 1] + str[end.direction][i - 1];
> 			if(sum[i - 1] + str[start.direction][i - 1]+ over[i] < l[i])
> 				l[i] = sum[i - 1] + str[start.direction][i - 1]+ over[i];
> 
> 			sum[i] = sum[i - 1] + str[start.direction][i - 1];
> 			if(l[i - 1] + str[end.direction][i - 1] + over[i] < sum[i])
> 				sum[i] = l[i - 1] + str[end.direction][i - 1] + over[i];
> 		}
> 		printf("%ld\n",l[end.point]);
> 
> 
> 		scanf("%ld",&n);
> 	}
> 	return 0;
> }

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator