Codeforces Round #483 (Div. 2) 题解(ABC)

A题

思路:总共要去掉n-1个数,如果n-1是个偶数,第一个人会比第二个人多去掉一个数,如果n-1是奇数,则两人去掉的数字是一样多的。所要这题只要排个序,取第(n-1)/2+1个数就行了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1005;
int n;
int a[maxn];
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    sort(a + 1, a + 1 + n);
    printf("%d\n", a[(n - 1) / 2 + 1]);
    return 0;
}

B题

思路:暴力搜索每一个格子,然后只需要判断带有数字的格子或者‘.’格子的数字是不是正确即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1005;
int n, m;
char mp[105][105];
bool ok(int x, int y) {
    if(x < 1 || y < 1 || x > n || y > m) return 0;
    return 1;
}
int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++)scanf("%s", mp[i]+1);
    int flag = 1;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= m; j++) {
            if(mp[i][j] == '*') continue;
            else if(isdigit(mp[i][j]) || mp[i][j] == '.') {
                int num ;
                if(isdigit(mp[i][j]))num = mp[i][j] - '0';
                else if(mp[i][j] == '.') num = 0;
                int ans = 0;
                if(ok(i - 1, j - 1) && mp[i - 1][j - 1] == '*') ans++;
                if(ok(i - 1, j) && mp[i - 1][j] == '*') ans++;
                if(ok(i - 1, j + 1) && mp[i - 1][j + 1] == '*') ans++;
                if(ok(i, j - 1) && mp[i][j - 1] == '*') ans++;
                if(ok(i, j + 1) && mp[i][j + 1] == '*') ans++;
                if(ok(i + 1, j - 1) && mp[i + 1][j - 1] == '*') ans++;
                if(ok(i + 1, j) && mp[i + 1][j] == '*') ans++;
                if(ok(i + 1, j + 1) && mp[i + 1][j + 1] == '*') ans++;
                if(ans != num) flag = 0;
            }
        }
    }
    if(flag) printf("YES\n");
    else printf("NO\n");
    return 0;
}

C题

思路:这貌似是一个结论题。询问p/q的最简分数在b进制下是不是一个有限小数。

对应的有一个结论,假设1/q在b进制下是有限小数,那么q一定是只由b的质因数组成。

举个最简单的例子:1/4在10进制下是不是有限小数,我们可以知道4=2*2,而2又是10的质因数之一,所以1/4是10进制下的有限小数。同理1/3就不是了。

这题有一个坑点,由于数据范围过大,所以必须要加一步优化才能通过
这在代码里讲。

还有一点,如果p/q是最简形式了之后,可以只考虑1/q,因为乘上一个p和没有p是没有什么影响的。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1005;
int n;
ll p, q, b;
ll gcd(ll a, ll b) {
    return b == 0 ? a : gcd(b, a % b);
}
int main() {
    scanf("%d", &n);
    while(n--) {
        scanf("%I64d%I64d%I64d", &p, &q, &b);
        if(p == 0) {
            printf("Finite\n");
            continue;
        }

        q = q / gcd(q, p);
        ll c = gcd(q, b);
        while(c != 1) {
           while(q%c==0) q /= c;
            c = gcd(q, b);
        }
        if(q == 1) printf("Finite\n");
        else printf("Infinite\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80335741