UVALive 3708_Graveyard

題目描述:

有個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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章