# APCS 109.10.17
## 上機題目
滿分解法
https://github.com/algo-seacow/Competitive-Programming/tree/master/apcs/10910
### 第 1 題: 人力分配
- https://zerojudge.tw/ShowProblem?problemid=f312
### 第 2 題: 人口遷移
- https://zerojudge.tw/ShowProblem?problemid=f313
### 第 3 題: 勇者修煉
- https://zerojudge.tw/ShowProblem?problemid=f314
### 第 4 題: 低地距離
- https://zerojudge.tw/ShowProblem?problemid=f315
## 筆試第二節
### Recursion
```cpp=
int f(int x, int y) {
if (x<=0) return y;
return f(x-1, 2*y + x + 3);
}
```
求 f(5, 3) 的結果,答案為 147
### Recursion, 填空
f(a,b) 會輸出 $a^b$ 的結果
```cpp=
int f(int a, int b) {
if (b<0) return 0;
if (b==0) return 1;
return {???};
}
```
1. a * f(a, b-1)
2. b * f(a, b-1)
3. a * f(a-1, b)
4. b * f(a-1, b)
答案是 a * f(a, b-1);
### Recursion, 1+2+3+...+n
```cpp=
int f(int n) {
if ( {???} ) {
return {???};
}
return n + f(n-1);
}
```
上面兩段 {???} 可以填入什麼,能讓 f 正確回傳 $a^b$?
a. n<=1 與 n
b. n<=0 與 0
c. n<1 與 0
1. a, b 可以
2. a, c 可以
3. a 可以
4. a, b, d 都可以
答案是三種都可以
### Recursion, 1+2+3+...+n, debug
```cpp=
int f(int n) {
if (n<0) {
return 0;
}
return f(n-1);
}
```
### 找第二大的數字, code 有錯, 找一組會讓他錯的測資
```cpp=
...
int a = p[0], b = p[0];
...
```
當 p[0] 是最大值時會有問題
### Switch
```cpp=
int ans = 0;
int a[6] = {0, 1, 5, 4, 4, 3};
for (int i=0; i<6; i++) {
switch(a[i]) {
case 1: ans += 1; break;
case 2: ans += 2;
case 3: ans += 3; break;
case 4: ans += 4; break;
case 5: ans += 5; break;
case 6: ans += 6;
default: ans += 6;
}
}
cout << ans << endl;
```
### Trace code, 2D array, 最後一題
### while loop 要繼續的條件
已知超過 365 天或是 人數變成負數就結束 while loop, 求 while loop 的 condition
答案是 people > 0 && days < 365
### DP, 費氏數列
```cpp=
int f(int n){
if (n<=1) return 1;
return f(n-1) + f(n-2) + 1
}
```
求 f(6) 的結果
### IF
```cpp=
int f(int a, int b) {
int n = 2, m = 5;
if (a<3 && b<7) {
if (a>=4) {
return n+m;
}
else {
return n-m;
}
}
else {
return n*m;
}
}
```
找出一個選項,包含三個 f,n+m, n-m, n*m 都有被呼叫到
### 字串解密
```cpp=
// code
```
只要算出第一個字就可回答題目
### IF
```cpp=
int main(){
int a=4, b=3, c=7;
if (a<b) cout << 'A'
else if (!(a==0)) cout << 'B'
else cout <<'C'
}
```
求輸出結果
###
## 筆試第一節
### bubble sort + struct cpy
```cpp=
struct {
int score;
char name[];
};
```
找錯
### 找最小的兩個數字
```cpp=
int a1 = 999, a2 = 999;
int a[] = {2, 1, 4, 7 , 8};
...
```
### 奇怪的篩法
```cpp=
int a[1001] = {};
for (int i=3; i<=1000; i+=2) {
for (int j=i*i; j<=1000; j = j + i + i) {
a[j] = 1;
}
}
```
找偶數 index 的總和,答案是 0
### scope : local / global
```cpp=
int rateUSD2TWD = 30;
int rateTWD2JPD = 5:
int USD2TWD(int x) {
int rateUSD2TWD = 40;
return x * rateUSD2TWD;
}
int TWD2JPD(int x) {
int rateTWD2JPD = 4:
return x * rateTWD2JPD;
}
void main(){
int iUSD = 10;
int iTWD = USD2TWD(iUSD);
cout << iTWD << endl;
int iJPD = TWD2JPD(iTWD);
cout << iJPD << endl;
int d = USD2TWD(iUSD) + TWD2JPD(iTWD) / rateTWD2JPD;
cout << d << endl;
}
```
正確的輸出是 300, 1200, 540 找出要輸出的數字
### Recursion, 費氏數列, dp
```cpp=
int a[10] = {0}
int f(int n) {
a[n]++;
if (n<=1) return 1;
return f(n-1) + f(n-2) + 1
}
```
call f(6) : 求出 a[0], a[1]
### Recursion, 前序後序
```cpp=
void f1(int x);
void f2(int x) {
if (x<=0) return;
f1(x-1);
cout << x << endl;
}
void f1(int x) {
if (x<=0) return;
cout << x << endl;
f2(x-1);
}
```
call f1(5), 求輸出的結果, 答案是 53124
### 化簡判斷式
```cpp=
if(x>10){
if(y<3){
return "B";
}
else{
if(x>y)return "A";
else return "B";
}
}
else return "A";
```
化簡成一個 if 跟一個 else
### 字元比較
```cpp=
s = "abcaaa"
```
給一函式f(text, n) 求間隔為 n 且相同字元組數為 1 的數量
n: 1~5
### IF
```cpp=
int f(int x){
if (...) return 4x-6
else return 4x+3
}
```
給 f(7), f(8) 的結果,求 if 的判斷條件
### 布林運算
```cpp=
!((x <= y) || (y > z) || (x < z))
```
選擇會使這個式子成立的選項
### ASCII, int 除法
```cpp=
int a = 1;
float b = 2.0;
int c = a / b;
printf("%d %c", c, 65 + c);
```
已知 'A', 'a' 的ASCII, 求輸出結果
### rotate, MOD
```cpp=
int f(int a, int b, int c, int n) {
while (n--) {
int tmp = a;
a = b;
b = c;
c = tmp;
}
return a;
}
```
找出輸出結果不是 25 的選項
### Trace code, do-while
```cpp=
int f(int x) {
int ans = 0;
do{
ans += x;
} while (ans >=0 && ans <= 10);
return ans;
}
int main(){
while (x<=40) {
x = x + f(x);
}
cout << x << endl;
}
```
### Nested loop, 大數乘法
```cpp=
a[] = {-2, -1, 0, 1, 2}
b[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for (int i=0; i<5; i++) {
c[i] = c[i] + a[j] * b[i+j];
}
```
### 奇怪的 stack, 計算字串中 AB 的個數是否一樣多
問哪組輸入會回傳true
```cpp=
char s[] = "abaabababa"; // a b 組成的字串
int n = strlen(text);
bool check(s, n){
int p[100] = {0};
int t = 0;
for(int i=0;i<n;i++){
if(s[i]=='a' && (p[i]==1 || p[i]==0)){
t++;
p[t] = 1;
}
if(s[i]=='b' && (p[i]==2 || p[i]==0)){
t++;
p[t] = 2;
}
else t--;
}
return t == 0;
}
```
## License and copyright
Author: 演算法海牛
Posted on: 2020-10-17
Licensed under: <a rel="license" href="http://creativecommons.org/licenses/by-nc/4.0/"><img alt="創用 CC 授權條款" style="border-width:0" src="https://i.creativecommons.org/l/by-nc/4.0/88x31.png" />