這道題而可以說是比較難的一道題,如果採用常規遍歷,會出現時長或者溢位的問題;
示例中給出的思路很值得借鑑;
個人通過該示例有以下幾個不同理解:
1.有時候兩個不同進製的數對比,我們可以進行進製,轉化十進位制來進行比較;
2.對於有些列舉或者尋找問題,為了不進行列舉遍歷,我們應該第一時間想到二分查詢;
對於第一點,這個在題目中有所體現,我們都是將其轉化為相應的十進位制下,然後進行比較,看是否相同;
在這個途中,有個難點:對於未知進製數,我們應該如何推斷,一定要注意溢位問題;
在本題目中,並沒有對進製有限定,如果按照常規進製計算,就會發生int或這longlong溢位,這一點要注意;
而對於未知進製數,我們就可以讓二分派上用場;
本題目的根本就是進製列舉,所以我們可以規定進製的上界和下界,從而通過二分來尋找乙個進製,使得通過改進之轉換的數和給定的數相同,來達到最終的結果;
那麼問題又來了,上界和下界如何確定?
下界好說,下界就可以取整個數字序列中最大的數,加一就是下界。例如對於乙個位15,最起碼應該是16進製制;
而對於上界,比較難以理解,上界取另乙個數字在十進位制下的值,加一就是上界;
舉個例子說明一下,假如另乙個數字十進位制下是156,如果當前給出的值是1,那麼多少進製可以讓其和156相等,答案就是156進製,由於在二分查詢下,我們輸入的序列大原本序列1位,所以還需要+1;
詳細**如下所示:
#include#include#include#include#includeusing namespace std;
typedef long long ll;
ll inf=(1ll<<63)-1;
char n1[20],n2[20],temp[20];
int m[256];
void init()
for(char c='a';c<='z';c++)
}ll convert2num10(char a,ll radix,ll t)
return ans;
}int findlargestdigit(char n2)
}return ans+1;
}int cmp(char n2,ll radix,ll t)
ll binarysearch(char n2,ll left,ll right,ll t)
return -1;
}int main()
ll t=convert2num10(n1,radix,inf);
//將n1從radix進製轉化為10進製;
ll low=findlargestdigit(n2);
//low是序列中最大的數,也就是可以比較的最小進製,例如110,則合法的進製最小都未進製
ll high=max(low,t)+1;
//high是上界
ll ans=binarysearch(n2,low,high,t);
if(ans==-1)
printf("impossible\n");
else
printf("%lld\n",ans);
system("pause");
return 0;
}
PAT A1010 二分進製結合重點題
這道題而可以說是比較難的一道題,如果採用常規遍歷,會出現時長或者溢位的問題 示例中給出的思路很值得借鑑 個人通過該示例有以下幾個不同理解 1.有時候兩個不同進製的數對比,我們可以進行進製,轉化十進位制來進行比較 2.對於有些列舉或者尋找問題,為了不進行列舉遍歷,我們應該第一時間想到二分查詢 對於第一...
pat 1010(二分 進製轉換)
pat 1010 思路 用確定的進製找不確定的進製,先求出已知進製的數字n1的10進製的結果sum,用longlong表示,接著確定n2的最小進製,遍歷n2陣列,找出最大的位數l。所以n2的進製在 l 1,sum 1 範圍內,這樣就可以用二分法求解了。include include include ...
PAT A1057 Stack 二分寫法
題目位址 這道題考的是優化,肯定能拿分,但是拿滿分需要一點思考,演算法筆記 上面用分塊的方法來處理,效率很高,但是有點複雜,分塊也算是比較冷門的處理手段,這道題用二分來做也可以,而且很簡單,用空間換時間。我知道這道題可以分塊思想來寫 但是我忘了 並且我想到另外一種方法 二分法 還更簡單 不過效率上面...