1. 程式人生 > >2018-10-7 Atcoder 刷題日記

2018-10-7 Atcoder 刷題日記

Atcoder Beginner 068 - C

題意:

有 n 個島嶼,k 條船,這 k 條船分別連線 ai 島嶼和 bi 島嶼,問能否只是用兩條船就從 島嶼1到達島嶼 n

思路:

這題我使用set處理的,當島嶼起點為1的時候,將其從島嶼1出發所能到達的所有島嶼 P 存進set中,然後再看到達終點是島嶼

n 的這些船的起點,如果這些起點有在set中的,那就成立了,即滿足 1 -> P -> n,僅用兩條船。

AC程式碼:

#include <bits/stdc++.h> using namespace std; const int maxx = 2e5 + 7; int n, k; int a[maxx], b[maxx]; set <int> sst;

int main() {     bool flg = 0;     cin >> n >> k;     for(int i = 1; i <= k; i++) cin >> a[i] >> b[i];     for(int i = 1; i <= k; i++) {         if(a[i] == 1) sst.insert(b[i]); // 存進set     }     for(int i = 1; i <= k; i++) {         if(b[i] == n) {             if(sst.find(a[i]) != sst.end()) { // 在set中查詢                 flg = 1; break;             }         }     }     if(flg) puts("POSSIBLE");     else puts("IMPOSSIBLE"); }

Atcoder Beginner 112 - D

題意:

給你一個數 m,問 m 能否被拆成 n 部分的和,即 m = a1 + a2 + ... + an。求這n個數的gcd最大是多少。

思路:

所求的是這些數的最大公約數 x,換句話說,這 n個數,都是x的倍數,而這 n個數的和又是 m,那就說明 m也是 x 的倍數,那麼我要的答案一定是 m的因子,而且要儘可能大,但是不是說越大越好,這個儘可能大的因子,必須合法,那麼怎麼判斷它合法與否呢,那就是,我這個 m 得能分成 n 份。也就是說我這個因子,不能大於m / n,如果我選的這個因子 x,比 m / n 大,即 x > m / n,  即 m / x < n,這就說明我沒法分成n份了,所以我只需要在 m / n 內選出 m的最大因子就好了。

AC程式碼:

#include <bits/stdc++.h> using namespace std; int n, m;

int main() {     while(scanf("%d %d", &n, &m) != EOF) {         int ans = 0;         if(m % n == 0) ans = m / n;         else {             int t = m / n;             for(int i = 1; i <= t; i++) {                 if(m % i == 0) ans = max(ans, i);             }         }         printf("%d\n", ans);     } }