2018黑龙江ACM省赛部分题解(hdu6480 hdu6484 hdu6486 hdu6489)(待更新)

新博客地址:https://blackbatty.github.io/

A - A Count Task

本题大概题意就是输入一个字符串,求它有多少个子字符串只包含一种小写字母。

我们大可以进行一次遍历,统计他相同的小写字母个数cnt,在求出它cnt+1的组合数。C(cnt + 1)取2,我也不知道这个正确的读法是怎么读的23333。

AC代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 100000 + 5;
char s[maxn];

int main() {
    int t, len;
    ll ans = 0, cnt = 0;
    scanf("%d", &t); //数据组数
    while (t--) {
        ans = 0;
        scanf("%s", s);
        len = strlen(s);
        for (int i = 0; i < len; i++) {
            cnt = 1; //初始化次数
            while (i + 1 < len) {
                if (s[i] == s[i + 1]) {
                    cnt++;
                    i++;
                } else break;
            }
            ans += cnt * (cnt + 1) / 2;
        }
        printf("%lld\n", ans);
    }
    return 0;
}

E - A Hard Allocation

这题才是真正的签到题!!!然而我却读错了题目。

这题思路没啥说的,就是看它的摸是否为0,是的话就输出0,否则输出1。因为它求的是获得最多蛋糕的人x与获得最少蛋糕的人u的差值是多少,我们稍微模拟下就知道如果不能平均分的话,最小就是相差1了。

AC代码:

#include <bits/stdc++.h>

using namespace std;

int main() {
    int t, m, n;
    scanf("%d", &t);
    while (t--) {
        scanf("%d%d", &n, &m);
        if (n % m == 0) printf("0\n");
        else printf("1\n");
    }
    return 0;
}

G - Flower

题目大致意思:给你n盆花的高度,问你修剪n - 1盆的高度,每次只能修剪1高度,能否最终修剪至所有花高度相同。

我们可以这么去想,找到最高的那一盆H_MAX不动,其他的每次加一,加到最高的那盆花的高度所需次数cnt,假如cnt大于等于H_MAX,则无法使所有花的高度相同,否则输出cnt。

AC代码:

#include <bits/stdc++.h>

using namespace std;
const int maxn = 100000 + 5;
int a[maxn] = {0};

int main() {
    int t, n, maxx, cnt = 0;
    scanf("%d", &t);
    while (t--) {
        maxx = -1, cnt = 0;
        scanf("%d", &n);
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
            if (maxx < a[i]) maxx = a[i];
        }
        for (int i = 0; i < n; i++) {
            if (i == maxx) continue;
            cnt += (maxx - a[i]);
        }
        if (cnt >= maxx) printf("-1\n");
        else printf("%d\n", cnt);
    }
    return 0;
}

J - The puzzle

大致题意:给你一个1~n的序列,求它排成递增序列所需要的最小次数。

一开始我也WA了几发,因为我看到这题后我第一反应就是想到了CF当中一道思维题CodeForces - 605A

~~又是一道因为读错题二引发的惨案。~~注意是给你一个1~n的序列,而不仅仅是一个大小为n的数组。

既然是一个1~n的序列,那么自然当a[i] == i的时候为正确位置。所以我们只需要判断下a[i] 是否等于 i,若不相等,则交换次数cnt加一,然后再更新,交换位置。存储数据所在位置我用的是map。

AC代码:

#include <bits/stdc++.h>

using namespace std;
const int maxn = 100000 + 5;
int a[maxn] = {0};

int main() {
    int t, n, temp, cnt = 0;
    map<int, int> ans;
    scanf("%d", &t);
    while (t--) {
        cnt = 0;
        ans.clear();
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &temp);
            a[i] = temp;
            ans[temp] = i;
        }
        for (int i = 1; i <= n; i++) {
            if (a[i] != i) {
                cnt++;
                ans[a[i]] = ans[i];
                temp = ans[i];
                ans[i] = i;
                swap(a[i], a[temp]);
            }
        }
        printf("%d\n", cnt);
    }
    return 0;
}
全部评论

相关推荐

我见java多妩媚:大外包
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务