# 11/10 練習考
連結
--
https://hackmd.io/@sa072686/rJQSay2Gh
題目(共四題)
--
* **PA**
**題意** :
:::success
給外圈格子數及內圈格子數求得整體長方形之長寬
:::
**解題思路** :
:::info
先將格子數相加窮舉得出長寬之所有可能
再將長寬代入內圈格子數驗證
(題目已說明只有唯一解 所以得到答案就可以break了
:::
:::spoiler **程式碼**
``` cpp=
#include <iostream>
#include <map>
using namespace std;
int main()
{
int a, b; cin >> a >> b;
int sum = a + b;
map<int, int> list;
for(int i = 1; i*i<=sum; i++)
{
if(!(sum%i)) {list[i] = sum/i;}
}
for(const auto &c : list)
{
if(c.first-2<1||c.second-2<1) continue;
if((b%(c.first-2)==0)&&(b%(c.second-2)==0))
{
cout << max(c.first,c.second) << ' ' << min(c.first,c.second) << endl;
break;
}
}
}
```
:::
**解題心得** :
:::warning
寫完的時候忘記看有沒有超出範圍(看了很久...
:::
* **PB**:
**題意** :
:::success
給A(500元)、B(100元)、C(50元)三數求他們的加總為定數的可能
:::
**解題思路** :
:::info
巢狀迴圈暴力解就行 (這題的ABC都<=50而已
:::
:::spoiler **程式碼**
```cpp=
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
int x; cin >> x;
int sum = 0;
for(int i = 0; i <= a; i++)
{
for(int j = 0; j <= b; j++)
{
for(int k = 0; k <= c; k++)
{
if(i*500+j*100+k*50==x) {sum++;}
}
}
}
cout << sum << endl;
}
```
:::
**解題心得** :
:::warning
本來想說先寫完暴力解法後再優化
結果就看到舒服的ABC範圍:)
:::
* **PC**:
**題意** :
:::success
給予一個字串
偵測第一個A跟最後一個Z的距離
(一定有A和Z
:::
**解題思路** :
:::info
找到第一個A就開始偵測Z
並儲存他們的位子
:::
:::spoiler **程式碼**
```cpp=
#include <iostream>
using namespace std;
int main()
{
string s;
cin >> s;
int ax = -1, zx;
for(int i = 0; i<s.size(); i++)
{
if(ax!=-1)
{
if(s[i] == 'Z') {zx = i;}
}
else if(s[i]=='A') {ax = i;}
}
cout << zx-ax+1 << endl;
}
```
:::
**解題心得** :
:::warning
那時候忘記寫`cin >> s;`超白癡的哈哈
:::
* **PD**:
**題意** :
:::success
喵喵讀N的倍數頁
剩下我來讀(但我總共只會讀d頁
我讀x分鐘 喵喵y分鐘
(假如讀完d頁後的那一頁是喵喵要念的會加上去
:::
**解題思路** :
:::info
1.迴圈計算然後偵測最後是不是喵喵要負責的
2.冷靜下來用國中數學解XD
:::
**程式碼** :
:::spoiler **1.爛解法**
``` cpp=
#include <iostream>
using namespace std;
int main()
{
int n, p, x, y;
cin >> n >> p >> x >> y;
int i = 1;
int sum = 0;
while(p)
{
if(p==1 && !(i%n==0))
{
if((i+1)%n==0) {sum += y;}
}
if(i%n==0) {sum += y;}
else {sum += x; p--;}
i++;
}
cout << sum << endl;
}
```
:::
:::spoiler **2.速解**
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n, p, x, y;
cin >> n >> p >> x >> y;
cout << y*(p/(n-1))+p*x << endl;
}
```
:::
**解題心得** :
:::warning
我就是用第一個方法寫的笨蛋QQ
:::
賽後心得
--
這次題目寫起來蠻歡樂的
但是還是有些小細節要注意
附上照片
--
