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
*/
本文深入解析了UVa1591数据挖掘难题,探讨了元素覆盖问题的解决策略。通过调整参数A和B,确保在增加偏移时避免元素覆盖,同时讨论了计算过程中的数据类型转换及空间优化技巧。

被折叠的 条评论
为什么被折叠?



