算法竞赛入门经典 习题4-9

UVa1591

Data Mining

挺没意思的一道题目。

书上对题目的描述有些难以理解,看英文原题会好一些。

P的偏移增加SP时,对应Q的偏移增加(SP + SP << A) >> B,所以只要AB使得上式大于SQ,那么就不会出现元素覆盖的情况。

这道题的困难在于不知道如何确定AB的上限,以及如果算出来的空间大于UINT_MAX时会产生回绕,所以在计算过程中必须要提升为unsigned long long才行。

还有Q中最后一个元素只用SQ的空间就行了,不需要额外的空间。

#include 
#include 

using namespace std;

void cal(unsigned int N, unsigned long long SP, unsigned long long SQ,
	unsigned int& A, unsigned int &B, unsigned long long &K)
{
	K = ULLONG_MAX;
	unsigned long long k;
	for (unsigned int a = 0; a < 32; a++)
	{
		for (unsigned int b = 0; b < 32; b++)
		{
			if (((SP + (SP << a)) >> b) >= SQ){
				k = (((N - 1) * SP + (((N - 1) * SP) << a)) >> b) + SQ;
				if (k < K){
					K = (unsigned int)k;
					A = a;
					B = b;
				}
			}
		}
	}
}

int main()
{
	unsigned int N;
	unsigned long long SP, SQ;
	while (cin >> N >> SP >> SQ){
		unsigned int A = 0, B = 0;
		unsigned long long K = 0;
		cal(N, SP, SQ, A, B, K);
		cout << K << ' '<< A << ' ' << B << endl;
	}
	return 0;
}
/*
20 3 5
1024 7 1
*/

你可能感兴趣的:(《算法竞赛入门经典》)