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

6 篇文章 0 订阅

本来以为是个水题,又涉及进制转换,所以想偷懒用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);
		
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值