題目簡述:有 t 組測資,r 個家,門牌號碼為 si (0 < si < 30000),求我到所有家的最小距離和。
題目 / ZJ
錯誤作法:取門牌號碼的 Min 和 Max,我的位置則在 (Min+Max)/2。
反例:(1) 2 3 (4) (5),若我在 3,距離和為 2+1+2=5;若我在 (4),距離和為 3+0+1=4。
解法:把所有門牌號碼排序,取中位數。
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
ios::sync_with_stdio(0), cin.tie(0);
int t, r;
cin >> t;
while(t--){
cin >> r;
int s[r], ans=0;
for(int i=0; i<r; i++){
cin >> s[i];
}
sort(s, s+r);
int m = s[r/2];
for(int i=0; i<r; i++){
ans += abs(s[i] - m);
}
cout << ans << '\n';
}
}
👉 回到:【CPE大學程式能力檢定】目錄