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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章