PAT A1010 二分進製結合重點題

2021-09-12 15:58:36 字數 1679 閱讀 8022

這道題而可以說是比較難的一道題,如果採用常規遍歷,會出現時長或者溢位的問題;

示例中給出的思路很值得借鑑;

個人通過該示例有以下幾個不同理解:

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 二分寫法

題目位址 這道題考的是優化,肯定能拿分,但是拿滿分需要一點思考,演算法筆記 上面用分塊的方法來處理,效率很高,但是有點複雜,分塊也算是比較冷門的處理手段,這道題用二分來做也可以,而且很簡單,用空間換時間。我知道這道題可以分塊思想來寫 但是我忘了 並且我想到另外一種方法 二分法 還更簡單 不過效率上面...