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);
}
}