閱讀656 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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;
}




最後更新:2017-04-03 05:39:49

  上一篇:go 漸變背景(background)效果
  下一篇:go Ubuntu14.04安裝JDK