hdu 5903
来源:互联网 发布:中华人软件下载 编辑:程序博客网 时间:2024/06/06 00:14
题目链接:点击打开链接
题解思路:令len = n/2;题目要求我们操作次数正好m的最小字典序,那么就分两种情况1:str[i]==str[i+len],此时可以不操作,也可以操作两步,也就是使两个字母都变成另一个字母;
我们可以设一个左右边界l,r。你会发现当l==0时奇数项是取不到了,这是就是任意的str[i]==str[i+len]的情况,当然我们一开始肯定要保证l<=m<=r,如果str[i]已经是'a'了,这个时候可能是要变得,那就是m==r的情况,因为你要是不操作,r减小了而m不变那么m就超出范围了,另外是str[i]!='a'这时要保证m-2>=l。2:当str[i]!=str[i+len]时,那么当min(str[p],str[p+len]) == ‘a’时,此时要变成'a'只需要操作一次,但可能操作一次后接下来就操作不了了,这是就要保证(l!=1或m当前状态是奇数)且m!=r(不然m只减1而r减了2就要越界了),下面的情况都是类似的
代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mx = 1e3+10;int n,m;char str[mx],ans[mx];int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); scanf("%s",str); int l = n/2,r = n,len = n/2; for(int i=0;i<len;i++) if(str[i]==str[i+len]) l--; if(!l&&(m&1)) { puts("Impossible"); continue; } if(m<l||m>r) puts("Impossible"); else{ int p =0; while(m){ if(str[p]==str[p+len]){ if(str[p]!='a'&&m>=l+2){ str[p] = str[p+len] = 'a'; m -= 2; } if(str[p]=='a'&&m==r){ str[p] = str[p+len] = 'b'; m -= 2; } r -= 2; }else{ char ch = min(str[p],str[p+len]); if(ch=='a'){ if((l!=1||(m&1))&&m<r){ str[p] = str[p+len] = 'a'; m--; }else{ if(max(str[p],str[p+len])=='b') str[p] = str[p+len] = 'c'; else str[p] = str[p+len] = 'b'; m -= 2; } }else{ if((l!=1||!(m&1))&&m>l){ str[p] = str[p+len] = 'a'; m -= 2; }else{ str[p] = str[p+len] = ch; m--; } } l--, r-=2; } p++; } puts(str); } } return 0;}
阅读全文
0 0
- hdu 5903
- hdu 5903 Square Distance
- HDU 5903 Square Distance
- hdu 5903 Square Distance
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- STM32多串口共用printf打印串口数据
- HDOJ 1395 2^x mod n = 1
- 测试Java的静态代码快执行时机
- Leetcode:Triangle
- 基于增量的矩阵聚类
- hdu 5903
- 【Mybatis学习】Mybatis框架中的动态sql
- GitHub 上开源的区块链项目 90% 死亡了
- 【Linux】Shell
- 数据结构-栈--进制转换
- 质因子分解问题
- 打印100~200 之间的素数
- 习题 6 6.6
- 1001.a+b Format