快递中转点
參考blog:https://blog.csdn.net/cjj122/article/details/75579390
在筆直的余姚大街上,分布著密密麻麻的店鋪,每天有成千上萬(wàn)筆快遞訂單。小明想開(kāi)個(gè)快遞中轉(zhuǎn)站,那每天一定
能賺不少錢(qián)。每筆訂單必須當(dāng)天送達(dá)指定店鋪。為了簡(jiǎn)化問(wèn)題,小明認(rèn)為所有店鋪都在一條坐標(biāo)軸上,并且每個(gè)店
鋪都在軸上有一個(gè)坐標(biāo),每天他都會(huì)把所有快遞放在一個(gè)中轉(zhuǎn)點(diǎn)上,然后一件一件開(kāi)始派送。可是小明是個(gè)懶人,
他想盡可能少走路。他的快遞中轉(zhuǎn)站開(kāi)在什么位置(位置可以是軸上任意點(diǎn),也可以和店鋪位置重合),能使得中轉(zhuǎn)
站到所有店鋪的距離之和的最小。那么就請(qǐng)你和小明一起解決一下這個(gè)小問(wèn)題吧,找到這個(gè)最小值。
Input
第一行一個(gè)整數(shù)N(1<=N<=1000)表示在軸上共有N個(gè)店鋪需要送達(dá)快遞。
接下來(lái)N行,每行一個(gè)整數(shù)ai(0<=ai<=1,000,000)表示每個(gè)店鋪的位置。
Output
包含一個(gè)整數(shù),中轉(zhuǎn)站到所有店鋪的距離之和的最小值。
Sample Input
5 0 20 40 10 30
Sample Output
60 //快遞中轉(zhuǎn)站建立在20的位置,則到5個(gè)點(diǎn)的距離分別是0,20,40,10,30
sol:先將店鋪的位置按坐標(biāo)軸從小到大排序,得0,10,20,30,40,調(diào)整法:假設(shè)快遞中轉(zhuǎn)站設(shè)在第一個(gè)點(diǎn)與第二個(gè)點(diǎn)比較,設(shè)在第一個(gè)點(diǎn),第一個(gè)點(diǎn)不走,后面四個(gè)點(diǎn)都要多走10;設(shè)在第二個(gè)點(diǎn),第一個(gè)點(diǎn)多走10,后面三個(gè)點(diǎn)少走10,顯然比前面優(yōu)。但多走的點(diǎn)還是比少走的少,所以再向右調(diào)整,選第三個(gè)點(diǎn)。與選第二個(gè)點(diǎn)比較,左邊兩個(gè)點(diǎn)多走10,右邊兩個(gè)點(diǎn)少走10。這就是中位數(shù)原理,假設(shè)n為奇數(shù),選在n/2+1的位置,如果是偶數(shù),選在n/2和n/2+1的位置都一樣。本題跟各個(gè)點(diǎn)之間的距離沒(méi)有關(guān)系,只跟有多少個(gè)點(diǎn)相關(guān)。
1 #include<bits/stdc++.h>
2 using namespace std;
3 int main()
4 {
5 long long n,f[1101],c,ans=0;
6 cin>>n;
7 for(int i=1;i<=n;i++)
8 cin>>f[i];
9 sort(f+1,f+1+n);
10 c=f[(n+1)/2];
11 for(int i=1;i<=n;i++)
12 ans=ans+abs(f[i]-c);
13
14 cout<<ans;
15 return 0;
16 }
總結(jié)
- 上一篇: PHP如何获取本周周二的日期?
- 下一篇: 制作输入框(Input)