链接:
https://www.51nod.com/Challenge/Problem.html#problemId=1621
题意:
一个车牌号由n位数字组成。如果一个车牌至少有k位数字是相同的,那么我们就说这个车牌漂亮的车牌。现在华沙想要改变他自己的车牌,使得他的车牌变得漂亮。当然,改车牌是要花钱的。每改变一位数字所要花费的费用等于当前位上的新旧数字之差的绝对值。那么总费用就是每位上所花费用的总和。
举例如下,旧牌为0123,新牌为7765,那么对应第一位所花费用为|0-7|=7,第二位为|1-7|=6,第三位为|2-6|=4,第四位为|3-5|=2,总和为7+6+4+2=19
华沙想用最少的钱,使他的车牌变得漂亮起来。现在给定n,k,和旧牌的号码,计算换牌的最少费,以及新牌的号码,如果最少费用的号码有多个,我们取字典序最小的那个。
样例解释:
在样例中,把第二个数字换成“8”花费|9-8|=1,把第五个数字换成“8”也花了1。
把第六个数字换成“8”花费|6-8|=2.总费用为1+1+2=4,新号码为“888188”
两个长度为n的序列比较方法如下。
存在两个序列x,y,长度都是n。
如果存在i(1≤i≤n)和任意j(1≤j<i)使得xi<yi 并且xj=yj ,那么我们就说x比y小。
输入样例
6 5
898196
输出样例
4
888188
思路:
这道题思路挺简单的,很快就想到思路,就这个编码,让我一言难尽,主要是要重写排序函数,不过经过不断的尝试和研究,也算有收获。
首先要明白是怎么样排序的,其实说白了大概就是个三维排序?!
解释一下三个变量的意思:
1)x(变成目标值i的绝对值)显然x要从小到大排序
2)pre(变成目标值i时记录它原来的值)显然要让字典序最小,就优先处理pre大的,所以要从大到小排序
3)index(记录该位置的索引)当x从小到大排序并且pre从大到小排序后,在这个数组中,显然会根据pre分块的,类似这样假设i=4
pre
4
4
5
5
3
3
6
6
2
2
……
前两个维度排序好,就是index的维度了,显然这个时候排序,就是每个相同的pre块里进行排序了,当目标值低于pre值时,要让字典序最小,显然要从小到大,反正高于就是从大到小了。
pre
4 1
4 5
5 4
5 7
3 8
3 2
6 10
6 12
2 9
2 6
……
还是有点懵的时候写的:
bool cmp(const Cnt &a, const Cnt &b){  if(a.x==b.x){  if(b.pre<a.pre) return a.index<b.index||b.pre<a.pre;  if(b.pre>a.pre) return a.index>b.index&&b.pre<a.pre;  if(b.pre==a.pre){  if(i<=b.pre) return a.index<b.index;  else return a.index>b.index;  }  }  return a.x<b.x;
}  

完全搞明白后写的:

bool cmp(const Cnt &a, const Cnt &b){    if(a.x==b.x){    if(b.pre==a.pre){    if(i<=b.pre) return a.index<b.index;    return a.index>b.index;    }    return b.pre<a.pre;    }    return a.x<b.x;
}  
可以看到开始的写法,当时还处于懵逼和探索阶段,后来探索明白了,第二种写法就非常的明晰了。
AC代码:
#include<bits/stdc++.h>
#define ll long long
#define endl "\n"
const int N=1e4+5;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
const double eps=1e-6;
using namespace std;
struct Cnt{  int pre,x,index;
}cnt[N];
int i;
bool cmp(const Cnt &a, const Cnt &b){  if(a.x==b.x){  if(b.pre==a.pre){  if(i<=b.pre) return a.index<b.index;  else return a.index>b.index;  }  return b.pre<a.pre;  }  return a.x<b.x;
}  void run(){  int n,k,miv=INF;  string s,t,ans;  cin>>n>>k;  cin>>s;  for(i=0;i<=9;++i){  for(int j=0;j<n;++j) cnt[j].x=abs(s[j]-'0'-i),cnt[j].index=j,cnt[j].pre=s[j]-'0';  sort(cnt,cnt+n,cmp);  t=s;  int cur=0;  for(int j=0;j<k;++j){  cur+=cnt[j].x;  t[cnt[j].index]='0'+i;  }  if(cur<miv){  miv=cur;  ans=t;  }  if(cur==miv&&t<ans) ans=t;  }  cout<<miv<<endl;  cout<<ans<<endl;
}  int main(){  ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);  //freopen("../input.txt","r",stdin);  //freopen("../output.txt","w",stdout);  int _=1;  //cin>>_;  for(int i=0;i<_;++i) run();  return 0;
}  

【51Nod三级题】花钱买车牌相关推荐

  1. axurehtml打开不用用_还有人花钱买会员看剧?赶紧用iPhone免费追剧

    对于小租来说,没有什么比下班宅在家边吃边刷剧更开心的事了. 然而每次当小租看得正欲罢不能的时候,发现需要充值VIP才能解锁接下来的续集,心情真是大起大落. "都看到这里了,怎么能断了呢?&q ...

  2. 2能不用cuda_洗洁精不用花钱买,自己在家2毛钱能做一大瓶,效果比买的还好!...

    洗洁精是一种家家户户必备的日常清洁用品,虽然国家对洗洁精产品质量有严格的卫生规定,但是洗洁精是由烷基苯磺酸钠等多种化学成分制作而成的,有些有害物质还是会通过皮肤和口腔进入到人体内的,对人体还是有一定伤 ...

  3. 中国3亿中年男人都在花钱买什么?数据分析后告诉你答案,很现实

    截止2018年底,国内有4.4亿50.60后,2.2亿 70后,如果再算上年头靠前的80后,预估中年男人的数量超过3亿. 三亿收入最高的中年男人消失在互联网购物平台里.他们的商业价值排在少女,儿童,少 ...

  4. 不能忍!花钱买网站VIP账号别人在用?

    [黑客联盟2016年12月05日讯]你的牙刷被别人偷偷用了,是不是不能忍? 那你花钱买的视频网站VIP账号呢?有些人可能能忍,然而有些人却不能. 今日,央视财经频道曝光了一则消息--你买的视频网站会员 ...

  5. AE软件+模板+教程+各种模板资料+安装教程(自己花钱买的)

    学习AE的过程中,稳定的软件必不可少,在网上找的大多都特么的-,不说了反正很烦,所以花钱买了一套,为了服务大家,拯救那些个正在找软件学AE的朋友们,我把自己买的资料免费分享给大家,资料主要包括以下资料 ...

  6. python微信点赞收费吗_点赞关于怎样微信刷投票数,我来教你微信投票怎样花钱买票...

    揭阳都来说说快速投票什么价格?细说微信投票目前什么价格?投票的意图在于评选成果.咱们常常会在一些节目中听到主持人说"请投出您名贵的一票,为您喜爱支撑的选手加油打气",可是作为在竞赛 ...

  7. 省钱省不对其实更浪费——分享我装修花钱买来的教训

    省钱省不对其实更浪费--分享我装修花钱买来的教训 一个月前,半夜,当我打开灯,坐在马桶上,呼吸着24小时充斥在卫生间里的悠悠臭气,还不敢开换气扇的时候,我知道,不得不承认,我曾经信心满满,断断续续干了 ...

  8. 趣头条“花钱买用户”?你看懂趣头条真正玩法了吗

    最近,被号称"五环外的今日头条"."资讯界的拼多多"的趣头条终于发布了它的第一份成绩单.在亮眼的业绩的背后,也有着一定的亏损,虽然说亏损在互联网企业当中不算什么 ...

  9. 微商花钱买客源靠谱吗?分享我一直在用的引流方法

    现在不论做任何项目,如果没有客源的话,那么就更别想出单了.所以很多做微商的朋友就开始去解决客源的问题,很多人去买客源,花钱买来的客源是否靠谱,有没有用,我来给大家剖析一下. 客源,在当今互联网时代,客 ...

最新文章

  1. c语言设计成行考核答案,20秋广东开放大学C语言程序设计成性考核参考答案(10页)-原创力文档...
  2. Tomcat 服务器只能存有一个正在运行的项目
  3. VB高级编程之:完全子类化模仿OFFICE2007按钮
  4. Clubhouse 推出漏洞奖励计划,严重漏洞最高可获3000美元
  5. Linux Shell变量
  6. 覆盖Dispatch响应消息
  7. android 分辨率适配的方法
  8. Vmprotect 驱动加壳踩坑
  9. 1965: 求矩阵中最小元素及其位置
  10. Spring工作原理
  11. ceph rbd扩容
  12. 工程力学专业考研转计算机,“初见不知提桶意,再见已是提桶人”,土木跨考计算机可行吗?...
  13. Maven问题总结 - 3 - 技术改变生活商业成就梦想 - 51CTO技术博客
  14. 为什么不是每个人都过着他梦想中的生活呢?
  15. 查看Windows10系统版本的方法
  16. 一名优秀的产品经理,需要了解的数据分析模型
  17. flask+vue+websocket+neo4j+torch模型项目常见报错
  18. android手机启动u盘,十款适合Android手机使用的U盘
  19. 赛博大陆的城镇化思考
  20. js和CSS实现图片旋转

热门文章

  1. oj 喵帕斯之天才算数少女
  2. 线性代数学习笔记——第五十四讲——非齐次方程组解的性质
  3. 学完Java后可以应聘哪些工作岗位?
  4. 华为1+X网络系统建设与运维(中级)——链路聚合
  5. Vue 中 Echarts绘图 在一个圆环图或多个圆环图中间插入图片 插入文字(考虑到浏览器大小兼容问题)
  6. 知道这些税务小技巧,财务就能给公司赚钱
  7. 安卓手机刷twrp和magisk
  8. 相机寻找最适合分辨率android,ARCore:获取相机的分辨率(ARCore : Get Camera's resolution)...
  9. 基于JAVA客服管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  10. SpringMVC体系分层模式(详细图文讲解)