橡皮最傻子的一集题解......
2024-04-28 22:52:46
发布于:浙江
5阅读
0回复
0点赞
原题传送门和某谷传送门
这题难是不难,就一个桶,一个sort,在带一点点贪心思路
but有点小陷阱,搞得我错了两次:(
题意分析:(某谷来的)
题目描述
给你个长度为 n 的字符串,要求你从这个字符串中选取 k 个字符,使选到的每个字母的数量的平方和最大。
输入格式
第 1 行两个整数 n,k (1≤k≤n≤100000 第 2 行 个大写字母,表示字符串。
输出格式
一个整数,表示选到的每个字母的数量的平方和。
思路分析:
这题其实和字符关系不大,只要各个读入字符,用桶记录下每个字母出现的次数,然后从大到小排序排序,贪心的从最大的选,不断判断,然后k不断减用过的个数,到k不够或后面都是卡片个数都是0时结束
核心如下:
for (int i = 0; i < 26; i++) {
if (a[i] == 0)break;
if (k >= a[i]) {
ans += a[i] * a[i];
k -= a[i];
} else {
ans += k * k;
break;
}
}
注意!!!
1.此题数据量较大,记得开long long
2.开头第一行和第二行间的换行符记得吸掉
完整代码:
#include<bits/stdc++.h>//标准万能头
using namespace std;
#define ll long long//秒接宏定义靠近
bool cmp(int x, int y) {
return x > y;
}//叠个cmp被动以备sort不时之需
ll n, k, a[26], ans = 0;
int main() {//**好吧
scanf("%d%d\n", &n, &k);//scanf输入,吸掉对面回车伤害
for (int i = 1; i <= n; i++)a[getchar() - 'A']++;//不断接受字符放入桶中
sort(a, a + 26, cmp);//sort主动出击
for (int i = 0; i < 26; i++) {//中心连招
if (a[i] == 0)break;//一旦对面没卡片了,直接准备结束战斗
if (k >= a[i]) {//对面k未归零,还有蓝来出牌
ans += a[i] * a[i];
k -= a[i];
} else {//对面没蓝了,也准备结束战斗
ans += k * k;
break;
}
}
cout << ans << endl;//最后一击
return 0;//拿下,结束战斗!
}
最傻子的一集.......(你们评论区留言,大家要是喜欢也可以继续这种风格)
对了,题外话:
三体ACGO分部等你!快来!!!
这里空空如也
有帮助,赞一个