UVa1591
挺没意思的一道题目。
书上对题目的描述有些难以理解,看英文原题会好一些。
当P
的偏移增加SP
时,对应Q
的偏移增加(SP + SP << A) >> B
,所以只要A
和B
使得上式大于SQ
,那么就不会出现元素覆盖的情况。
这道题的困难在于不知道如何确定A
和B
的上限,以及如果算出来的空间大于UINT_MAX
时会产生回绕,所以在计算过程中必须要提升为unsigned long long
才行。
还有Q
中最后一个元素只用SQ
的空间就行了,不需要额外的空间。
#include <iostream>
#include <climits>
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
*/