1010 Radix (25分)测试点1

这个题目不用二分法可以做,但是测试点7是绝对过不了的,因为这个测试点数值极其大,而且是一个确定的值,并不是impossible,所以无法骗过系统。

二分法测试点1,过不了,是因为有一个地方没有注意到,那就是进制的上限问题。

首先很容易想到,我寻找答案的范围在一个确定的范围内,而这个范围的最小值是 第一个数字中最小的数字+1,因为进制不可能小于某个数字,不然就是不合法的。

那么最大的数字呢?首先很容易想到是 第一个数字的值val,因为对于val进制来说,只要第二个数字存在不是第一位的值,那么第二个数字的总值必定大于等于第一个值。
比如第一个值是6,第二个数字是6进制,那么10刚好是6;
11就大于6 了。所以取val作为进制上限是一个很不错的选择。
但是有没有一种可能,val的值一开始小于了最小值?
来看一个例子:

这里是引用
1 1 1 10


那个对于这个例子,low=2,high=1,如果while(low<=high)进行判断,那么一开始就不会执行查找操作,导致第一个测试点没过。
所以,一开始对high赋值的时候,应该取val和low的最大值,保证算法至少可以执行一次。

附本人代码:

#include
#include
#include
#include
#include
using namespace std;
long long getval(string s, long long radix) {
	long long res = 0;
	for (int i = s.length() - 1; i >= 0; i--) {
		long long t = isalpha(s[i]) ? s[i] - 'a'+10 : s[i] - '0';
		res +=t*pow(radix, s.length() - i - 1);
	}
	if (res < 0)return -1;
	else return res;
}
int main() {
	string N1, N2,tN;
	long long tag, radix,val;
	cin >> N1 >> N2;
	scanf("%lld%lld",&tag, &radix);
	if (tag == 1) {
		val = getval(N1, radix);
		tN = N2;
	}
	else {
		val = getval(N2, radix);
		tN = N1;
	}
	char c = *max_element(tN.begin(), tN.end());
	long long low = isalpha(c) ? (c - 'a' + 10) : (c - '0')+1;
	long long high = max(low, val);
	while (low<=high)
	{	
		long long mid = (low + high) / 2;
		long long tmpval = getval(tN, mid);
	    if (tmpval<0 || tmpval>val)high = mid - 1;
		else if (tmpval < val)low = mid + 1;
		else if (tmpval == val) {
			printf("%lld", mid);
			return 0;
		}
	}
	printf("Impossible");
	return 0;
}

你可能感兴趣的:(甲级代码精炼)