码迷,mamicode.com
首页 > 其他好文 > 详细

[topcoder]TheConsecutiveIntegersDivOne

时间:2015-01-23 00:45:54      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

http://community.topcoder.com/stat?c=problem_statement&pm=13625&rd=16278

首先,如果记得曼哈顿距离最小值那个问题,会想起一维的情况可证,点出现在中位数那里是最小的。这里也可证明,四个点,出现在中位数位置是最小的。

题解里的做法是,试探所有让某个想减的绝对值最小的情况。

我的代码有点丑,但过了:

#include <vector>
#include <algorithm>

using namespace std;

class TheConsecutiveIntegersDivOne {
public:
	int find(vector <int> numbers, int k) {
		sort(numbers.begin(), numbers.end());
		int d = k / 2;
		int left = 0;
		int sumL = 0;
		for (int i = left; i < left + d; i++) {
			sumL += numbers[i];
		}
		int sumR = 0;
		int right = left + d;
		if (k % 2 == 1) {
			right++;
		}
		for (int i = right; i < right + d; i++) {
			sumR += numbers[i];
		}
		int result = sumR - sumL - d * d;
		while (right + d < numbers.size()) {
			sumL += numbers[left + d];
			sumL -= numbers[left];
			sumR += numbers[right + d];
			sumR -= numbers[right];
			result = min(result, sumR - sumL - d * d);
			left++;
			right++;
		}
		return result;
	}
};

  

[topcoder]TheConsecutiveIntegersDivOne

标签:

原文地址:http://www.cnblogs.com/lautsie/p/4242975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!