jzoj 3832. 在哪裏建釀酒廠(bro)

Description
一個小島Abstinence上的居民非常喜歡一種不含酒精的啤酒,迄今爲止這種不含酒精的啤酒只能從波蘭進口。但是今年,Abstinence島上的一個城市要建一座釀酒廠。所有的城市都坐落於海岸線上,而且它們僅被一條沿着海岸線繞島一週的公路所連接。釀酒廠的投資商收集了所有城市對這種酒的需求量,即每個城市每天需要多少桶酒。他同時也有一張兩個相鄰城市之間的距離表。運輸上的花費是每桶每英里一元。一天的啤酒運輸費用是從釀酒廠將啤酒運送到各個城市所需的費用總和。每天的花費取決於酒廠的位置,投資商希望找到建廠的位置以使每天的運輸花費最小。

【任務】
寫一個程序:
從文本文件BRO.IN中讀入城市數,城市間的距離,以及每個城市對酒的日需求量。
計算每天最少的運輸花費。
將結果寫入文件BRO.OUT。

Input
在輸入文件的BRO.IN中的第一行包含一個整數n, 5<=n<=10000,表示城市的個數,(我們假設城市沿着公路編號,相鄰的城市有相鄰的編號,城市1和n也是相鄰的)。以下的n行,每行有兩個被一個空格隔開的非負整數zi,di,表示第i個城市對啤酒的日需求量和該城市沿高速公路到下一個城市的距離。整條公路的長度不超過1000000英里,每個城市的日需求量不超過1000桶。

Output
你的程序應當在輸出文件BRO.OUT中寫入一個整數,表示最少可能的每日運輸費用。

Sample Input
6
1 2
2 3
1 2
5 2
1 10
2 3

Sample Output
41

Data Constraint
數據規模
對於30%的數據,有N<=30。
對於100%的數據如題目。

//written by zzy

題目大意:

有個環,讓你求出一個點(酒廠)使環上的所有點到它的距離乘需求量之和最小的值。

題解:

由於是個環,所以每個點到其他的點的路只有兩條,枚舉一個作酒廠在求出所有點到它的貢獻(距離乘需求量)即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 100005
using namespace std;

int i,j,n,m,x,d1,d2,len;
long long sum,ans;
int num[N],s[N];

int main()
{
	freopen("bro.in","r",stdin);
	freopen("bro.out","w",stdout);	
	scanf("%d",&n);
	for (i=1;i<=n;i++) {
	 scanf("%d%d",&num[i],&x);
	 s[i]=s[i-1]+x; len+=x;
    }
    ans=9999999999997;
    for (i=1;i<=n;i++) {
    	sum=0;
    	for (j=1;j<=n;j++) {
    		d1=abs(s[j-1]-s[i-1]); 
    		d2=len-d1;
    	    sum+=num[j]*min(d1,d2);
        }
        ans=min(ans,sum);
    } 
    printf("%lld",ans);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章