本篇含cpe必考1星題庫中1~10題。
本篇篇幅較大,可點選左列索引,跳至想查看的題目。
最近又開始考cpe啦,邊複習邊把過去不夠直覺的程式碼及錯誤的部分作修正!!(修正至第10題)
大家考試加油呀🌞
1. uva #10041
題目大意:
選一個點,其到其他點距離總和最短。- 注意:點有可能有重複
核心思路:找中位數。
1 | //19 |
2. uva #10055
- 題目連結
- 題目大意:
求兩軍人數差(絕對值)。- 注意:
題目提到數字最高可到2^32,而int的整數範圍為-(2^31) ~ 2^31-1,所以不能使用int來讀取。
long long 範圍:-(2^64) ~ 2^64-1
unsigned long long 使用abs()會有overload報錯
且雖說題目提到敵軍數量必大於我軍,但無法得知第一個讀取的數字為敵軍還是我軍人數,所以計算時仍須加上絕對值。:))
- 注意:
- 核心思路:所求之人數差為 兩數相減加絕對值。
1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
int main()
{
long long h, o;
while(cin>>h>>o)
{
cout<<abs(o-h)<<endl;
}
}
3. uva #10035
題目大意:
給兩數做加法,計算有多少次進位。- 注意:此題數目數目在int範圍內。無需使用字串或其他方式方式讀入。
核心思路:
- 位數對齊後一一對應,由後往前相加(前一次的進位也要加)
- 數字%10 可取得某位數值
- 需要一個變數紀錄前一次進位
1 | // 11 |
- 字串寫法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using namespace std;
int main()
{
string n1, n2;
while(cin>>n1>>n2)
{
if(n1=="0" && n2=="0")
break;
int l1 = n1.length()-1;
int l2 = n2.length()-1;
int c=0;
int c_cnt = 0;
// 數字1和數字2都有的位數
for(; l1>=0&&l2>=0; l1--,l2--)
{
if((n1[l1]-(int)'0'+n2[l2]-(int)'0'+c)>=10)
{
c=1;
c_cnt+=1;
}
else
c=0;
}
//剩餘位數
if(l1>=0 || l2>=0)
{
string longn;
int start;
if(l1>=0)
{
longn = n1;
start = l1;
}
if(l2>=0)
{
longn = n2;
start = l2;
}
for(int i=start; i>=0; i--)
{
if((longn[i]-(int)'0'+c)>=10)
{
c=1;
c_cnt+=1;
}
else
c=0;
}
}
if(c_cnt==0)
cout<<"No carry operation."<<endl;
else if(c_cnt==1)
cout<<"1 carry operation."<<endl;
else
cout<<c_cnt<<" carry operations."<<endl;
}
}
4. uva #100
題目大意:
有一演算法如下:- input n
- print n
- if n = 1 then STOP
- if n is odd then n ←− 3n + 1
- else n ←− n/2
- GOTO 2
且某數n的”cycle length”定義為,n經此演算法最終收斂為1,需要經幾次改變。
給兩數i、 j,求i、j閉區間內(包含i、j)所有數的cycle length最大者。- 注意:此題提供的i、 j,不一定i<=j!!
核心思路:
區間的數一一套入演算法,計算各數cycle length。
求最大cycle length:計算完某數cycle length,與當前最大cycle length比較,若大於當前最大cycle length,將最大cycle length更新為某數cycle length。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48//22
using namespace std;
int main(){
int i, j;
while(cin>>i>>j)
{
int start, end;
if(i>j)
{
start = j;
end = i;
}
else
{
start = i;
end = j;
}
int max_cnt = 0;
for(int k=start; k<=end; k++)
{
int cnt = 0;
int n=k;
while(true)
{
cnt++;
if(n==1)
break;
if(n%2==1)
n = 3*n+1;
else
n = n/2;
}
if(cnt>max_cnt)
max_cnt = cnt;
}
cout<<i<<" "<<j<<" "<<max_cnt<<endl;
}
}5. uva #10929
題目大意: 判斷一正整數n是否為11的倍數,當輸入測資為0,表示結束
- 注意:此題目測資數字很大,用long long 也不能完全讀取。
(意思就是不能用除以11後餘數是否為0來判斷啦QAQ)
- 注意:此題目測資數字很大,用long long 也不能完全讀取。
核心思路:
- 大數讀取:使用字串讀取
- 11倍數特性:{奇數位數字和-偶數位數字和}為11的倍數
若某數{奇數位數字和-偶數位數字和}為11的倍數,其為11的倍數。
特別注意!!!若題目數字前面有0,輸出時0需印出來; 若有空格則不印,
讀取字串時用cin>>str;,可避免讀取到空白字元其他數字倍數規則整理:
1的倍數:任何數皆為1的倍數。
2的倍數:個位數字為偶數(含0)。
3的倍數:各個數字和為3的倍數。
4的倍數:末二位數為4的倍數(含00)。
5的倍數:個位數字為5或0。
6的倍數:各個數字和為6的倍數(同時是2和3的倍數)。
7的倍數:由個數起每三位數字一節,各奇數節和 與 偶數節和 相減,其差是7的倍數。
8的倍數:末三位數為8的倍數(含000)。
9的倍數:各個數字和為9的倍數。
10的倍數:個位數字為0。
11的倍數:奇數位數字和與偶數位數字和相差為11的倍數。
12的倍數:同時是3和4的倍數。
13的倍數:由個數起每三位數字一節,各奇數節和 與 偶數節和相減,其差是13的倍數。
1 | //21 |
6. uva #10101
此題題目格式是真的很麻煩:) 花了我幾個小時debug:)))
題目大意:
左邊的文字對應右邊的數字:kuti: 10000000
lakh: 100000
hajar: 1000
shata: 100將題目給的數字用上述對應文字的方式表現出來,如:
- 45897458973958 印出 45 lakh 89 hajar 7 shata 45 kuti 89 lakh 73 hajar 9 shata 58
- 00000000000000 印出 0
- 1000000000 印出 1 shata kuti
- 000100100 印出 1 lakh 1 shata
注意:此題輸出題號的格式要使用setw(4)!!!(佔四字元寬且靠右)
1 |
|
7. uva #10240
題目大意:
一個測資有多行,每行含一個 國家名 與 該國家的一個人名,要求統計出 此測資中各國家出現的次數。- 注意:
此題國家名必為1個字串,名字可能有多個字串組成(雖然測資好像都是兩個字串組成)。
此題也沒有重複的人名,可以放心。
- 注意:
核心思路:用map去對應國家名與其出現次數。
1 | //8 map |
8. uva #10008
題目大意:
給一數字n,代表此測資接下來會有n行字串。請統計這n行字串中,每個英文字母分別出現幾次,並依**出現次數降序(若出現次數相同,依字母順序排)**印出。- 注意:
- 英文字母不區分大小寫(大小寫視為同一字母)
- 不須去計算非英文字母的字元出現次數
- 印出答案時,只印出出現次數>=1的英文字母
核心思路:
- 不區分大小寫(也可用toupper函式判別)
- 統計:建立一個struct統計出現次數(大小為26)
- 降序排列:用sort()函式,並將排列規則cmp()設為 出現次數降序,若出現次數相同,依字母順序排
1 | //49 |
9. uva #10222
- 題目連結
- 題目大意:
解碼一段文字(中間可能含空白)。
解碼原則:密文字母在鍵盤上的按鍵位置左數兩個按鍵,該按鍵上的字母即是明文。- 注意: 此題須decode英文字母部分,空白字元維持原本
- 核心思路:
- 使用字串存鍵盤上的文字
- 暗文字元左邊兩個字元的位置,為其明文。
1 | //20 |
10. uva #11332
題目大意:
若 n = 1234567892, 則函數f(n)定義為:f(n) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 2 = 47
則
f(f(n)) = 4 + 7 = 11
f(f(f(n))) = 1 + 1 = 2如上述連續套用f(n)最終會得到一個位數字,此個位數定義為g(n)。
求g(n)。
1 | //8 |
關於
本系列為個人刷題的紀錄,做為記錄與將來複習用,所以有些題目註解簡略。
若恰好對你有幫助,我也很開心:)
希望看到這篇的你們和我都能在cpe取得好成績^^