poj 2128 Highways

简介:

真是一道坑爹的题目,题目其实说的不是很清晰。。。

WA了2次。。。

[题意] 在一条单向公路上,有n个村庄,第i个村庄只能到i以后的村庄,而不能到i之前的村庄(因为是单行道)。新村长要建两条新路,使得各个村庄之间都能走通(一条反向的就可以,为什么要建两条?题目说了,只建一条不足矣增加自己的政绩)


[思路] 找出所有路段中最短的,加上原来的总长,就是答案。有一点要注意,题目说两条路的4个端点必须不同,因此要排除端点重合的问题。另外,n=2和n=3是无解的。

我们知道要满足条件,那么我们就必定使1~n有通路,我们可以从1~n修一条路,在从n-3条边选出最短的边就可以了;这里为什么是从n-3条边里选,这里我们要去掉两个端点的边;

例如:n=4 时 4 7 9,这里答案是12而不是11;


#include  <stdio.h>

int main()
{
	int N;	//有N个村庄
	scanf("%d",&N);

	int pos;	//临时保存各个村庄现在的坐标点
	int pre=0;    //临时保存村庄过去的坐标点
	int sum=0;
	int i;
	int minRoad=0x7fffffff;
	int start;
	for(i=2;i<=N;i++)
	{
		//输入每个村庄pos坐标,村庄1的坐标为0
		scanf("%d",&pos);
		sum+=(pos-pre);

		if (i!=2 && i!=N && pos-pre<minRoad)
		{
			minRoad=pos-pre;
			start=i-1;
		}

		pre=pos;
	}
	
	if (N<4)
	{
		printf("0\n");
		return 0;
	}

	printf("%d\n",sum+minRoad);
	//printf("%d %d %d %d\n",start+1,1,N,start);
	printf("%d %d %d %d\n",N,1,start,start+1);   //居然都AC了

	return 0;
}

根本不用sum,本来就会输入总和的:

#include  <stdio.h>

int main()
{
	int N;	//有N个村庄
	scanf("%d",&N);

	int pos;	//临时保存各个村庄现在的坐标点
	int pre=0;    //临时保存村庄过去的坐标点
	int i;
	int minRoad=0x7fffffff;
	int start;
	for(i=2;i<=N;i++)
	{
		//输入每个村庄pos坐标,村庄1的坐标为0
		scanf("%d",&pos);

		if (i!=2 && i!=N && pos-pre<minRoad)
		{
			minRoad=pos-pre;
			start=i-1;
		}

		pre=pos;
	}
	
	if (N<4)
	{
		printf("0\n");
		return 0;
	}

	printf("%d\n",pos+minRoad);
	//printf("%d %d %d %d\n",start+1,1,N,start);
	printf("%d %d %d %d\n",N,1,start,start+1);   //居然都AC了

	return 0;
}




相关文章
poj 3298 数状数组
题目大意是一条大街上住着n个乒乓球爱好者,他们的水平高低用一个数值表示,他们经常举办比赛,比赛要三个人,一人当裁判。对裁判是有一定要求的,裁判的水平必须介于两选手之间且必须住他们中间,计算可以举办多少场比赛
49 0
|
存储
|
人工智能 机器学习/深度学习
|
C语言
poj 2503 查字典
Description You have just moved from Waterloo to a big city. The people here speak an incomprehensible dialect of a foreign language.
879 0
poj 1455
Description n participants of > sit around the table. Each minute one pair of neighbors can change their places.
626 0
|
机器学习/深度学习
|
机器学习/深度学习