NOIP学习之综合应用:161.啤酒厂选址

测试链接
总时间限制: 1000ms 内存限制: 65536kB
描述
海上有一个岛,在环海边上建有一条环岛高速公路,沿着公路有n(5 < n < 10000)个居民点,假设每个居民点有一个编号,从0开始,按顺时针依次从小到大(即,0,1,…,n-1)编号。在岛上啤酒很受青睐。某啤酒企业计划在岛上投资建一个啤酒厂,并根据啤酒需求每天向居住点送啤酒。已知两个相邻的居民点的距离以及每个居住点每天的啤酒需求量(假设每个居住点每天不超过2000桶)。假定每单位长度的路程送一桶啤酒需要的费用恒定(为单位费用)。请问,选择哪一个居民点建啤酒厂,才能使每天送啤酒的费用最小(空车不计费用)。

输入
第一行:为居民点数目n
后面为n行,每行为一个居民点的啤酒需求量以及按顺时针离下一个居民点的距离(均为整数,空格间隔),从编号为0的开始,按单增顺次给出。
注意:后面第n行对应于居民点(n-1)的啤酒需求量以及到编号为0的居民点距离。
输出
啤酒厂所在的居民点编号以及每天的运输费用,其间以逗号间隔
样例输入
6
500 10
300 30
350 25
400 60
700 28
200 35
样例输出
0,94100

#include
#include
#include
using namespace std;
int main(){
	char str[100];
	int n,len,minidx,a[10001],b[10001],c[10001];
	long long min=0,cost,dist,dist1,dist2,sum=0;
	cin>>n;	                                            
	for(int i=0;i<n;i++)
	{
		cin>>a[i]>>b[i];
		sum+=b[i];
	}
	c[0]=0;
	for(int i=1;i<n;i++)
	{
		c[i]=c[i-1]+b[i-1];
	}	
	for(int i=0;i<n;i++)
	{
		cost=0;
		for(int j=0;j<n;j++)
		{
			if(i==j) continue;
			dist1=fabs(c[i]-c[j]);
			dist2=sum-dist1;
			dist=(dist1<dist2)?dist1:dist2;
			cost+=a[j]*dist;			
		}	
		if(cost<min||min==0)
		{
			min=cost;
			minidx=i;
		}	
	}
	cout<<minidx<<","<<min;
	return 0;				
}

你可能感兴趣的:(NOIP学习,c++)