Problem - 1562B - Codeforces

题意:给定一个字符串,每次操作可以选择这个字符串中的一种字符,将他们全部都减1,最多K次操作,问可以形成的字典大小最小的字符串。

题解:首先我们观察这个字符串,很明显,如果两个字符不相同,我们把大的减小到和小的相等,然后再两个一起减小,就省去了一部分的操作,从而减少操作次数,因此,我们先把每种字符按照第一个先后出现的顺序存储,然后遍历这个数组,判断你当前读入的字符是不是到现在为止的最大字符,如果不是,就证明这个字符比前面的小,这样这个字符肯定就已经被连带减小了

例如:c b 在减小c的时候,当c等于了b,就可以同时减小两个。 所以当该字符不是最大字符时,就不需要管它。如果是,就判断该字符与上一个最大字符的差值,即你要变成上一个字符需要几次操作,然后与前面需要的操作相加,看看是否超过最大操作数,如果超过就能减少几个减少几个,没超过就加到总操作数里继续看下一个字符。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=4e4+5;
const ll mod=1e9+7;
ll dp[N],vis[26];
vector<ll> q[N],p;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
ll t;cin>>t;
while(t--){
ll n,m;cin>>n>>m;
string s;cin>>s;
p.clear();
memset(vis,0,sizeof(vis));
for(ll i=0;i<=25;i++) q[i].clear();
for(ll i=0;i<s.size();i++){
q[s[i]-'a'].push_back(i);//记录该字符出现的位置
if(!vis[s[i]-'a']){
vis[s[i]-'a']=1;
p.push_back(s[i]-'a');//记录每种字符出现的先后顺序
}
}
ll sum=0;
ll maxn=-1;
ll last=0;
for(ll i=0;i<p.size();i++){
maxn=max(maxn,p[i]);
if(p[i]!=maxn) continue;//判断是否最大值
if(p[i]-last+sum>m){
for(ll j=0;j<q[p[i]].size();j++){
s[q[p[i]][j]]-=(m-sum);//将每个位置的字符能减少几减少几
}
for(ll j=p[i]-(m-sum);j<p[i];j++){
for(ll z=0;z<q[j].size();z++){
s[q[j][z]]=p[i]-(m-sum)+'a';//减少过程中,判断有没有比它小的字符被连带减小,有就更新
}
}
break;
}
for(ll z=0;z<=p[i];z++){
for(ll j=0;j<q[z].size();j++){
s[q[z][j]]='a';//如果操作数足够,就肯定会减少到 a
}
q[z].clear();//该字符减少完后就没有了,所以要清零
}
sum+=p[i]-last;
last=p[i];
}
cout<<s<<endl;
}
}

最新文章

  1. [LeetCode] Spiral Matrix II 螺旋矩阵之二
  2. jQuery 自定义插件 (分页控件)
  3. 上传Text文档并转换为PDF
  4. https的了解
  5. js简单模仿队列
  6. C++面向对象要点
  7. SQL Server设置主键自增长列
  8. PHP图片加文字水印和图片水印方法
  9. 假设说这个世界不是真实存在的,仅仅是一段代码,迄今为止你发现了哪些bug?
  10. ●HDU 3507 Print Article
  11. Java虚拟机-类文件
  12. debug_backtrace
  13. [转]Rancher 快速上手指南操作(1)
  14. H5 66-清除浮动方式二
  15. yuv rgb 互转 公式 及算法
  16. C#设置IE代理
  17. 【POJ2248】加法链 idfs
  18. jquery 跨域请求
  19. C# AES要解密的数据的长度无效
  20. solr学习之一 搜索基本知识

热门文章

  1. 全新升级的AOP框架Dora.Interception[4]: 基于Lambda表达式的拦截器注册方式
  2. Systemverilog-- OOP--对象的拷贝
  3. Tapdata 的 2.0 版 ,开源的 Live Data Platform 现已发布
  4. ajax传递参数与controller接收参数映射关系
  5. Golang仿云盘项目-2.2 保留文件元信息
  6. Unity3D学习笔记8——GPU实例化(3)
  7. springboot动态读取properties 和yml的配置
  8. V.Internet基础及应用
  9. 一文解析Pinia和Vuex,带你全面理解这两个Vue状态管理模式
  10. 【Kaggle】如何有效避免OOM(out of memory)和漫长的炼丹过程