PAT (Advanced) 1010 (二分查找+任意进制转十进制)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w419387229/article/details/81385897

本来以为是个水题,又涉及进制转换,所以想偷懒用java搞,结果GG了。 想了半天觉得进制限制应该不是36,才开始改。

思路就是找到查找目标的进制上下界,下界是这个字符串中最大的字符+1,上界有两种情况:一种是如果已经确定的那一房,十进制大于下界,那么上界就是那个十进制数+1;否则就是下界到36。

还有个坑就是可能存在不止一个答案,二分查找最小的答案。

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;

public class Main{
	static Scanner sc = new Scanner(System.in);
	static int tag, rad;
	static String s1, s2;
	
	static long findX(String s) {
		char maxc = '0';
		for(int i = 0; i < s.length(); i++) {
			if(s.charAt(i) > maxc)
				maxc = s.charAt(i);
		}
		if(maxc == '0') return 2;
		if(maxc >= '1' && maxc <= '9') return maxc - 47;
		else return maxc - 86;
	}
	
	static long exchange(String s, long rad) {
		int len = s.length();
		long sum = 0;
		for(int i = 0; i < len; i++) {
			if(s.charAt(i) <= '9')
				sum = sum * rad +(s.charAt(i) - '0');
			else
				sum = sum * rad +(s.charAt(i) - 'a' + 10);
		}
		return sum;
	}
	
	static void solve(String s, long left, long right, long res) {
		long mid = (right + left) / 2;
		long ans = 0;
		while(left <= right) {
			long tmp = exchange(s, mid);
			if(tmp > res || tmp < 0) {
				right = mid - 1;
			}
			else if(tmp < res) {
				left = mid + 1;
			}
			else {
				ans = mid;
				right = mid - 1;
			}
			mid = (left + right) / 2;
		}
		if(ans == 0)
			System.out.println("Impossible");
		else
			System.out.println(ans);
	}
	public static void main(String[] args) {
		s1 = sc.next(); s2 = sc.next(); tag = sc.nextInt(); rad = sc.nextInt();
		long res, left;
		String s;
		if(tag == 1) {
			res = exchange(s1, rad);
			left = findX(s2);
			s = s2;
		}
		else {
			res = exchange(s2, rad);
			left = findX(s1);
			s = s1;
		}
		if(left >= res)
			solve(s,left,36,res);
		else
			solve(s,left,res+1,res);
		
	}
}

猜你喜欢

转载自blog.csdn.net/w419387229/article/details/81385897