19:啤酒厂选址
總時(shí)間限制: 1000ms 內(nèi)存限制: 65536kB
描述
海上有一個(gè)島,在環(huán)海邊上建有一條環(huán)島高速公路,沿著公路有n(5 < n < 10000)個(gè)居民點(diǎn),
假設(shè)每個(gè)居民點(diǎn)有一個(gè)編號(hào),從0開始,按順時(shí)針依次從小到大(即,0,1,…,n-1)編號(hào)。
在島上啤酒很受青睞。某啤酒企業(yè)計(jì)劃在島上投資建一個(gè)啤酒廠,并根據(jù)啤酒需求每天向居住點(diǎn)送啤酒。
已知兩個(gè)相鄰的居民點(diǎn)的距離以及每個(gè)居住點(diǎn)每天的啤酒需求量(假設(shè)每個(gè)居住點(diǎn)每天不超過2000桶)。
假定每單位長度的路程送一桶啤酒需要的費(fèi)用恒定(為單位費(fèi)用)。請(qǐng)問,選擇哪一個(gè)居民點(diǎn)建啤酒廠,
才能使每天送啤酒的費(fèi)用最小(空車不計(jì)費(fèi)用)。
輸入
第一行:為居民點(diǎn)數(shù)目n
后面為n行,每行為一個(gè)居民點(diǎn)的啤酒需求量以及按順時(shí)針離下一個(gè)居民點(diǎn)的距離(均為整數(shù),空格間隔),
從編號(hào)為0的開始,按單增順次給出。
注意:后面第n行對(duì)應(yīng)于居民點(diǎn)(n-1)的啤酒需求量以及到編號(hào)為0的居民點(diǎn)距離。
輸出
啤酒廠所在的居民點(diǎn)編號(hào)以及每天的運(yùn)輸費(fèi)用,其間以逗號(hào)間隔
樣例輸入
6
500 10
300 30
350 25
400 60
700 28
200 35
樣例輸出
0,94100
解析:
下面以第一個(gè)村莊作為起始點(diǎn)(數(shù)軸零點(diǎn)),順時(shí)針方向?yàn)閿?shù)軸正方向
先計(jì)算每個(gè)村莊在數(shù)軸上的坐標(biāo);
利用兩個(gè)村莊的坐標(biāo)可以方便地計(jì)算兩個(gè)村莊的順時(shí)針距離t1;
利用環(huán)形公路周長sum和t1可以計(jì)算兩個(gè)村莊逆時(shí)針距離t2;
t1和t2比較小的那一個(gè)即為兩個(gè)村莊的最短距離。
依次將所有村莊當(dāng)做建廠點(diǎn),計(jì)算該方案的運(yùn)費(fèi)。
枚舉完所有的方案后即可知道最小花費(fèi)的方案。
本題真實(shí)的測試數(shù)據(jù)肯定沒到10^4,否則本算法復(fù)雜度O(n^2)是無法通過的。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<math.h>
4 struct obj
5 {
6 long long num;//該村莊啤酒需求量
7 long long dis;//該村莊距離下一個(gè)村莊的距離(順時(shí)針的下一個(gè)村莊)
8 long long d; //該村莊距離起始點(diǎn)的距離(相當(dāng)于順時(shí)針坐標(biāo))
9 };
10 int main()
11 {
12 long long n,i,j;
13 struct obj *a;
14 long long sum=0;//環(huán)形公路總長
15 long long cost,minCost,minIndex;//某種建廠方案的話費(fèi);歷史上各種建廠方案的最小花費(fèi)
16 long long distance,t1,t2;
17
18 freopen("data.in","r",stdin);
19 scanf("%lld",&n);
20 a=(struct obj *)malloc(sizeof(struct obj)*n);
21 for(i=0;i<n;i++)
22 {
23 scanf("%lld%lld",&a[i].num,&a[i].dis);
24 sum=sum+a[i].dis;
25 }
26
27 a[0].d=0;//第一個(gè)村莊作為起始點(diǎn)
28 for(i=1;i<n;i++)
29 {
30 a[i].d=a[i-1].d+a[i-1].dis;
31 }
32
33 minCost=0;
34 for(i=0;i<n;i++)//依次考慮選擇第i個(gè)村莊做建廠點(diǎn)
35 {
36 cost=0;
37 for(j=0;j<n;j++)//計(jì)算從其他村莊運(yùn)輸?shù)降趇個(gè)村的費(fèi)用
38 {
39 if(j==i) continue;
40 else
41 {
42 t1=fabs(a[i].d-a[j].d);
43 t2=sum-t1;
44 distance=t1<t2?t1:t2;
45 cost=cost+a[j].num*distance;
46 }
47 }
48 if(cost<minCost||minCost==0) { minCost=cost; minIndex=i; }
49 }
50 printf("%lld,%lld
",minIndex,minCost);
51 return 0;
52 }
總結(jié)
- 上一篇: Excel-VBA基础语法
- 下一篇: PHP网站后台使用ukey登录