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

TopCoder SRM 625 Incrementing Sequence 题解

时间:2014-06-26 12:01:28      阅读:349      评论:0      收藏:0      [点我收藏+]

标签:class   blog   code   使用   2014   string   

本题就是给出一个数k和一个数组,包括N个元素,通过每次增加数组中的一个数的操作,最后需要得到1 - N的一个序列,不用排序。

可以从暴力法入手,然后优化。

这里利用hash表进行优化,最终得到时间效率是O(n*n)的算法,而且常数项应该很低,速度还挺快的。

思路:

1 如果数组A[i]在1 -N 范围内,就利用bool B[]记录,这个数已经找到了;

2 如果A[i]的值之前已经找到了,那么就增加k操作,得到新的值A[i]+k,看这个值是否找到了,如果没找到,就使用B记录,如果之前已经找到了,那么就继续重复增加k的操作。

3 如果最后A[i]+k大于N了,那么就可以返回IMPOSIBLE了,因为这样不可能得到要求的数列了。

本算法的缺点是需要额外O(n)的bool空间,不过一般算法会通过sort之后处理也需要O(lgn)的int空间了,所以空间效率其实也差不多。

而本算法的优点是:不需要排序,不需要做模运算,常数项应该低点,运行速度快。

#include <vector>
#include <string>
using namespace std;

class IncrementingSequence
{
public:
	string canItBeDone(int k, vector<int> &A)
	{
		int N = (int)A.size();
		vector<bool> B(N+1);
		for (int i = 0; i < N; i++)
		{
			if (A[i] > N) return "IMPOSSIBLE";
			while (A[i] <= 0 || B[A[i]])
			{
				A[i] += k;
				if (A[i] > N) return "IMPOSSIBLE";
			}
			B[A[i]] = true;//不要错写成B[i]
		}
		for (int i = 1; i <= N; i++)	//别漏这个循环判断
		{
			if (!B[i]) return "IMPOSSIBLE";
		}
		return "POSSIBLE";
	}
};


附一道250分的水题,需要找a*b +c = y,给出y找到a,b,c其中a, b, c 不能等于0, 或者1

#include <vector>
#include <math.h>
using namespace std;

class AddMultiply
{
public:
	vector<int> makeExpression(int y)
	{
		vector<int> vx(3);
		vx[0] = -1; vx[1] = 2;
		vx[2] = y - vx[0] * vx[1];
		return vx;
	}
};

当然,如果还有额外的限制,那么本算法不是完善的,不过这里不错的思路是先找好难的部分,乘法部分,然后找加数就容易了。


TopCoder SRM 625 Incrementing Sequence 题解,布布扣,bubuko.com

TopCoder SRM 625 Incrementing Sequence 题解

标签:class   blog   code   使用   2014   string   

原文地址:http://blog.csdn.net/kenden23/article/details/34807367

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