題目描述:
有個1000步距離的圓環,環上的兩點之間的距離是一樣的,及環上的點平分周長。
題目給出初始點個數和將要加上點的個數,把初始的點調整下位置,然後把要加入點的接上,
求總調整距離的最小值。
解題方法:
把圓環看成一維的座標軸。計算原始點和加上附加點後所有的座標數組P1,P2,
對比P1中每個原始點兩側離P2中任意點最近的點,貪心的算出每個的最小調整距離,其之和就是結果。
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#define MAX(a,b) (a)>(b)?(a):(b)
using namespace std;
const double LENGTH = 10000;
const int MAXSIZE = 1010;
double posOrigin[MAXSIZE];
double posTotal[MAXSIZE * 3];
int main()
{
int i,j;
int originNum, addNum;
double sum;
while (~scanf("%d %d", &originNum, &addNum)){
sum = 0;
double p1 = (double)LENGTH / originNum;
double p2 = (double)LENGTH / (originNum + addNum);
for (i = 0; p1*i < LENGTH; i++){
posOrigin[i] = p1*i;
}
for (i = 0; p2*i < LENGTH; i++){
posTotal[i] = p2*i;
}
for (i = 1; i < originNum; i++){
for (j = 0; j < (originNum + addNum)-1; j++){
if (posOrigin[i] < posTotal[j + 1]){
sum += abs(posOrigin[i] - posTotal[j])<abs(posOrigin[i] - posTotal[j + 1]) ? abs(posOrigin[i] - posTotal[j]):abs(posOrigin[i] - posTotal[j + 1]);
break;
}
}
}
double x = sum * 1000;
if ((int)x == x){
printf("%.1lf\n", sum);
}
else{
printf("%.4lf\n", sum);
}
}
return 0;
}