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

编程入门 行业动态 更新时间:2024-10-27 16:24:21

2018黑龙江ACM省赛部分<a href=https://www.elefans.com/category/jswz/34/1769599.html style=题解(hdu6480 hdu6484 hdu6486 hdu6489)(待更新)"/>

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

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

更多推荐

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

本文发布于:2024-02-26 16:16:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1703132.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:题解   黑龙江   ACM

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!