题目描述:
有个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;
}