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