11/10 練習考

連結

https://hackmd.io/@sa072686/rJQSay2Gh

題目(共四題)

  • PA

    題意 :

    給外圈格子數及內圈格子數求得整體長方形之長寬

    解題思路 :

    先將格子數相加窮舉得出長寬之所有可能
    再將長寬代入內圈格子數驗證
    (題目已說明只有唯一解 所以得到答案就可以break了

    程式碼
    ​​​​#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; ​​​​ } ​​​​ } ​​​​}

    解題心得 :

    寫完的時候忘記看有沒有超出範圍(看了很久

  • PB:

    題意 :

    給A(500元)、B(100元)、C(50元)三數求他們的加總為定數的可能

    解題思路 :

    巢狀迴圈暴力解就行 (這題的ABC都<=50而已

    程式碼
    ​​​​#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; ​​​​}

    解題心得 :

    本來想說先寫完暴力解法後再優化
    結果就看到舒服的ABC範圍:)

  • PC:

    題意 :

    給予一個字串
    偵測第一個A跟最後一個Z的距離
    (一定有A和Z

    解題思路 :

    找到第一個A就開始偵測Z
    並儲存他們的位子

    程式碼
    ​​​​#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; ​​​​}

    解題心得 :

    那時候忘記寫cin >> s;超白癡的哈哈

  • PD:

    題意 :

    喵喵讀N的倍數頁
    剩下我來讀(但我總共只會讀d頁
    我讀x分鐘 喵喵y分鐘
    (假如讀完d頁後的那一頁是喵喵要念的會加上去

    解題思路 :

    1.迴圈計算然後偵測最後是不是喵喵要負責的
    2.冷靜下來用國中數學解XD

    程式碼 :

    1.爛解法
    ​​​​#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; ​​​​}
    2.速解
    ​​​​#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; ​​​​}

    解題心得 :

    我就是用第一個方法寫的笨蛋QQ

賽後心得

這次題目寫起來蠻歡樂的
但是還是有些小細節要注意

附上照片

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →