UVALive 3708_Graveyard

16 篇文章 0 订阅
6 篇文章 0 订阅

题目描述:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值