1. 程式人生 > >Codevs 1507 酒廠選址

Codevs 1507 酒廠選址

scan style cti dev b-s panel nim -1 row

1507 酒廠選址

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold 題目描述 Description

Abstinence(戒酒)島的居民們酷愛一種無酒精啤酒。以前這種啤酒都是從波蘭進口,但今年居民們想建一個自己的啤酒廠。島上所有的城市都坐落在海邊,並且由一條沿海岸線的環島高速路連接。酒廠的投資者收集了關於啤酒需求量的信息,即每天各城市消費的啤酒桶數。另外還知道相鄰城市之間的距離。每桶啤酒每英裏的運費是1元。日運費是將所需要的啤酒從酒廠運到所有城市所必需的運費之和。日運費的多少和酒廠的選址有關。投資者想找到一個合適的城市來修建酒廠,以使得日運費最小。

請設計一個程序:從文件bre.in 讀入城市的數目、相鄰兩城市間的距離以及每個城市消費的啤酒桶數,計算最小的日運費,將結果寫到輸出文件bre.out中。

輸入描述 Input Description

第一行是一個整數n(5 <= n <= 10000) ,表示城市的數目。 城市沿高速路編號,使得相鄰的城市的編號也相鄰(城市1和n也被認為是相鄰)。 以下的n行,每行有兩個非負整數。第I+1行的數 zi、di分別是城市I每日的啤酒消費量(桶)和從城市I沿高速路到下一個城市的距離(英裏)。高速路的總長不會超過65535 英裏。每座城市的日消費量不會超過255桶。

輸出描述 Output Description

一個整數,表示所需的最小日運費(元)。

樣例輸入 Sample Input

6

1 2

2 3

1 2

5 2

1 10

2 3

樣例輸出 Sample Output

41

/*
    給出的數據會組成一個環,分別順時針和逆時針求出兩個前綴和s1[],s2[]
    由於環上兩個點之間的路徑可以是優弧也可以是劣弧
    假設兩個點編號分別為a,b(a<b),那麽a,b之間最短路就可以O(1)求出來,為min(s2[b]+s1[a],s1[b]-s1[a])
    有了O(1)求最短路的辦法,就可以枚舉酒廠地址,所以總的時間復雜度為n^2,數據規模10000,過不過就看臉啦
    一定要用long long,而且用了long long,極大值就不能再賦成0x7fffffff,要用一個更大的值
*/ #include<iostream> #include<cstdio> using namespace std; #define maxn 10010 long long n,s1[maxn],s2[maxn],s[maxn],w[maxn],ans=17826622193699999; long long work(long long start){ long long res=0; for(long long i=1;i<=n;i++){ if(i==start)continue; long long ss=start,tt=i; if(ss>tt)swap(ss,tt); long long dis=min(s2[tt]+s1[ss],s1[tt]-s1[ss]); res+=dis*w[i]; } return res; } int main(){ scanf("%d",&n); for(long long i=1;i<=n;i++){ scanf("%lld%lld",&w[i],&s[i]); if(i+1<=n) s1[i+1]=s1[i]+s[i]; } for(long long i=n;i>=1;i--) s2[i]=s2[i+1]+s[i]; for(long long i=1;i<=n;i++)//枚舉每個點做酒廠 ans=min(ans,work(i)); printf("%lld",ans); }

Codevs 1507 酒廠選址