思路:
(1)n1:確定進製的數,n2:未確定進製的數
方便後面進行統一計算
(2)n1轉換成10進製數,二分n2進製,將n2轉換成十進位制與n1進行比較,大了就把進製往小的方向調整,小了的話往大的調;如果相等,則找到進製,輸出
tips:本題的變數盡量都使用long long型
(坑:進製radix的範圍超過int)
其他細節點請看注釋,很詳細的~~
#include
#include
#include
#include
#include
#include
using
namespace std;
//const int maxn=10010;
long
long map[
256]
;long
long inf=((
long
long)1
<<63-
1);//long long 的最大值為2^63-1
char n1[22]
,n2[22]
,temp[22]
;int tag,radix;
//初始化字元對應的整數,如果是直接大括號賦值,顯得太麻煩了
void
init()
//將a轉化為十進位制,t為上界
long
long
convertnum10
(char a,
long
long radix,
long
long t)
return ans;
}//n2的十進位制與n1的十進位制數進行比較
intcmp
(char n2,
long
long radix,
long
long t)
//二分法
long
long
binarysearch
(char n2,
long
long left,
long
long right,
long
long t)
return-1
;//解不存在
}//求最大數字
intfind_largest_digit
(char n2)
return ans+1;
}int
main()
long
long t=
convertnum10
(n1,radix,inf)
;//將n1從radix進製轉化成十進位制
//最小進製,就比如,如果數字裡最大的是『 z ',那麼它的進製數就不可能小於36。
//求出最大數字,那麼進製數的底線就是最大數字+1
long
long low=
find_largest_digit
(n2)
;//設兩個數為n1和n2,其中n1已知進製數,那麼將其轉換為十進位制數為n1x,那麼最大的進製數為n1x和最小進製數中大的那乙個
//因為取n1x是,基數取1,要是進製數再大,就根本取不到了
//上界為下界與n1的十進位制的較大值+1
long
long high=
max(low,t)+1
;long
long ans=
binarysearch
(n2,low,high,t)
;//二分,基數的上限理論上可以是無窮大,所以用long long
if(ans==-1
) cout<<
"impossible"
;else
cout
}
思路:
(1)令sum[i]表示a[1]到a[i]的和值,計算連續子串行的和值,即可計算sum[j]-sum[i-1]
(2)sum[i]就是嚴格單調遞增,就可採用二分法來做題
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
1000010
;int sum[maxn]
;int
main()
for(i=
1;i<=n;i++
)else
if(j<=n&&sum[j]
-sum[i-1]
}for
(i=1
;i<=n;i++)}
return0;
}
思路:
(1)輸入陣列,排序
(2)題目目標:a[i]+a[j]=s;所以a[j]=s-a[i];
以i為迴圈變數,二分查詢第乙個滿足條件的j的位置,找到後,輸出i,j
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
100010
;int a[maxn]
;int
main()
sort
(a,a+n)
;for
(i=0
;iif(i==n)
cout<<
"no solution"
;return0;
}
PAT甲級C 總結(二)
1.stl 中的find begin,end,val 方法用於查詢某物件,begin和end為查詢的首尾位址,區間是左閉右開,val為查詢的值,如果找到將返回指定的位址,如果沒找到,將返回引數end 2.dfs演算法中,如果對於圖的路徑陣列maps n n 出現了記憶體受限,可以使用vectorma...
PAT甲級20分的題總結
今天終於刷完了pat甲級20分的題。下面總結一下。20分的題沒有涉及資料結構中圖和樹中的知識,也沒有涉及到dp,基本上都是字串 數字拆解 進製轉化 分數求和 大數加減法,數學題這種基礎的題目。前面的比較簡單,後面個別題目有一定難度。一定要熟練掌握stl中常用容器的用法,特別是map vector s...
浙大pat甲級 1024
可用3個vector來進行處理,先將輸入的數字都壓入到第1第2個vector中,從i 0到k迴圈判斷是否為對稱數,如果不是對稱數則將其與倒轉數相加,並將得到的每一位數加入到第三個vector的頭部,並將新的第三個vector重新賦值給第一第二,直到該數為對稱數或i k結束迴圈。ac include ...