c++ 二分答案(基礎應用)


c++ 二分答案

問題

使得x^x達到或超過n位數字的最小正整數x是多少?n<=2000000000

分析

對與這種較難求解的問題,我們很難想出較好的解決策略。但是,我們至少知道答案一定在1與2000000000之間,能否轉換二分查找的思想,對答案進行二分查找呢?當然是可以的,但在二分查找中有比較,在二分答案中,我們也需要有比較,我們用檢查函數來實現。如果檢查出的是一個合法的解,那么我們嘗試找更優的解,如果檢查出的是不合法的解,我們嘗試找合法的解,這就是二分答案的思想。在這題中,我們設計的檢查函數就是x^x的數位是否超過n位,合法返回真,不合法返回假。再二分求解即可。

AC代碼

#include <bits/stdc++.h>
using namespace std;
int o;
bool check(int k)//查看這個數的位數 
{
	long long p = k;
	return p * log10(1.0*k) + 1 >= o;//判斷數位的公式 
}
int medium()
{
	int l = 0;//確保范圍在 l 和 r 之間  
	int r = 2000000000;
	while (l + 1 < r)//確保不越界(l < r) 
	{
		int mid = (l + r) / 2;
		if (check(mid))//如果這個解滿足要求 
		{
			r = mid;//縮小范圍 
		}
		else//如果這個解不滿足要求 
		{
			l = mid;//繼續在右半部分尋找解  
		}
	}
	if (check(l))//如果解合法 
	{
		return l;
	}
	else//不合法 
	{
		return r;
	}
}
int main()
{
	cin >> o;
	cout << medium() << endl;
	return 0;
}

二分答案的思路總結:
step1: 在答案可能的范圍內[L,R]二分查找答案,
step2: 檢查當前答案是否滿足題目的條件要求
step3: 根據判斷結果更新查找區間,繼續判斷答案,達到最優值
備注:
公式推導:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM