专栏文章
题解:P13878 [蓝桥杯 2023 省 Java/Python A] 平均
P13878题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio32lw0
- 此快照首次捕获于
- 2025/12/02 12:34 3 个月前
- 此快照最后确认于
- 2025/12/02 12:34 3 个月前
1.题目思路
一道贪心。
显然,修改任意一个数对每种数出现次数的贡献都相等(最多只可能让出现次数变化 ),所以就是比较朴素的贪心(作者一开始甚至有动态规划的念头)。所以取代价小的进行修改一定比取代价大的优。
很容易转化成:用结构体存储每个数对应的值、修改代价,并按照修改代价从小到大排序。接着从前往后遍历,如果当前这个数出现的次数大于 (题目中给出),那么就选这个数修改(不必在意其被修改为什么数,最终一定会使所有数出现次数相等,因为题目保证 是 的倍数),答案累加修改代价,并让当前数出现次数减 (最优解下,当前数一定会修改成其他数,否则就浪费了这次操作)。
最终输出答案即可。注意到 的值域较大,保险起见答案变量记得开 !
2.代码
注:代码仅供参考。
CPP#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int max_n=1e5+2;
int n,times[11]; //每种数出现的次数
long long ans; //答案(开 long long)
struct node{ //每个数
int a,b;
} nums[max_n];
bool cmp(node a,node b){
return a.b<b.b;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&nums[i].a,&nums[i].b);
times[nums[i].a]++;
}
sort(nums+1,nums+n+1,cmp);
int tot=n/10;
for(int i=1;i<=n;i++){
if(times[nums[i].a]>tot){
ans+=nums[i].b;
times[nums[i].a]--;
}
}
printf("%lld\n",ans);
return 0;
}
3.后记
更多内容,请移步至:
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...