PAT甲級 二分

2021-10-03 21:27:16 字數 2962 閱讀 9836

思路:

(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 ...