CF1526 D. Kill Anton

CF1526 D. Kill Anton

题意:

给你一个由’A’,‘N’.‘T’,'O’四个字符组成的字符串b,现在要求你改变b的顺序得到a,使得a通过移动回到b的步数最多。
每次移动只能移动相邻两项

题解:

官方题解说:最佳情况为相同字符靠在一起
证明我也不清楚。。
证明可以看看这篇文章
按照官方题解的说法,将相同的字符排列在一起,一共就四种字符,那么也就是排列方式一共就24种(4!),我们直接暴力求出每种情况,然后求出其要移动的步数,取最大值
这个移动的步数咋求?
假设原先字符串是ANTON,下标依次是1,2,3,4,5,现在我们将其打乱成ATONN,原先的下标就成了1,3,4,2,5,那13425变回12345的步骤不就是其逆序对吗?所以对于每一种情况我们求其逆序对,然后保留最大值
在这里插入图片描述

这题挺好~

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[50];//记录字符个数 
vector<int>id[50],c;//记录字符 
string s;ll nxt;
void msort(int l,int r){//归并排序 if(l>=r)return;//区间元素小于1 int mid=l+r>>1;msort(l,mid);//分 msort(mid+1,r);//分 int i=l,j=mid+1,k=0;int t[r-l+1];while(i<=mid&&j<=r){if(c[i]<=c[j])t[k++]=c[i++]; else{//此时存在逆序对,在归并过程中记录逆序对的个数 t[k++]=c[j++];nxt+=mid-i+1;//记录逆序对数 }}while(i<=mid)t[k++]=c[i++];while(j<=r)t[k++]=c[j++];for(i=l,k=0;i<=r;i++,k++)c[i]=t[k];//将t排好序的数复制到c中 
} 
int main()
{ios_base::sync_with_stdio(false);int t;cin>>t;while(t--){int r[5]={0,'A','N','O','T'};//通过函数枚举各种可能性; memset(a,0,sizeof(a));//清空 id['A'-'A'].clear();id['N'-'A'].clear();id['O'-'A'].clear();id['T'-'A'].clear();cin>>s;for(int i=0;i<s.size();i++){a[s[i]-'A']++;//记录每个字母的个数 id[s[i]-'A'].push_back(i+1); }ll ans=0;string as;do{c.clear();nxt=0;//清零记录下一种情况的操作数for(int i=1;i<=4;i++){//四个字符分别连续存入形成一个新的字符串 c.insert(c.end(),id[r[i]-'A'].begin(),id[r[i]-'A'].end());}/*cout<<"c= ";for(int i=0;i<c.size();i++)cout<<s[c[i]-1];cout<<endl; */msort(0,c.size()-1);if(nxt>ans){ans=nxt;as="";for(int i=1;i<=4;i++) as+=string(a[r[i]-'A'],(char)r[i]);//存入此时的最优字符串,即前面c的原串 }}while(next_permutation(r+1,r+5));//对四个字符全排列的各种可能性; if(ans!=0)cout<<as<<endl;else cout<<s<<endl;//ans为0说明原字符串已经为最优解 } return 0;
}

我还有看到一种写法,本质一样,它将转化后的字符串下标定为1,2,3,4…,根据这个将原字符串下标定义为nxt[j],然后跑逆序对,一样的

for(int i=0;i<len;i++){//将该情况的字符串转为数字 for(int j=0;j<=3;j++){if(mp[s[i]]==nxt[j]){//每次打乱nxt c[i]=j;break;}}}
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;
//qdu打铁匠
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=2e5+9;
int nxt[]={0,1,2,3};
ll a[maxn];
ll c[maxn],b[maxn];
map<char,int>mp;
ll cnt=0; 
void unite(int l,int mid,int r){if(l>=r)return ;unite(l,(l+mid)>>1,mid);unite(mid+1,(mid+1+r)>>1,r);int i=l,j=mid+1;for(ll k=l;k<=r;++k){if(j>r||i<=mid&&c[i]<=c[j]) b[k]=c[i++];else b[k]=c[j++],cnt+=mid-i+1;}for(ll k=l;k<=r;++k) c[k]=b[k]; 
}
string s;
ll cal(int len){for(int i=0;i<len;i++){//将该情况的字符串转为数字 for(int j=0;j<=3;j++){if(mp[s[i]]==nxt[j]){//每次打乱nxt c[i]=j;break;}}}cnt=0;unite(0,(len-1)>>1,len-1);//求逆序对 return cnt;
}
void solve(){cin>>s;string a,n,o,t;for(int i=0;i<s.length();i++){if(s[i]=='A')a+='A';if(s[i]=='N')n+='N'; if(s[i]=='O')o+='O';if(s[i]=='T')t+='T';}string ans=s;ll sum=0;do{ll now=cal(s.size());if(now>sum){//得到更大的逆序对,即需要步数更多 sum=now;ans.clear();for(int i=0;i<=3;i++){if(nxt[i]==0)ans+=a;if(nxt[i]==1)ans+=n;if(nxt[i]==2)ans+=t;if(nxt[i]==3)ans+=o;} }}while(next_permutation(nxt,nxt+1+3));cout<<ans<<endl;
}
int main()
{int t=read();mp['A']=0;mp['N']=1;mp['T']=2;mp['O']=3;while(t--){solve();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 3.0预览版体验

目前.NET Core 3.0的版本为.NET Core 3.0 Preview 3&#xff0c;对应ASP.NET Core 3.0 Preview 3。ASP.NET Core 3.0 之后将不再支持.NET Framework&#xff0c;只运行在.NET Core 上面。ASP.NET Core 3.0 现在已经出到了第三个预览版&#xff0c;增加和改进了很多功能。环境准…

C# .net 中 Timeout 的处理及遇到的问题

C# 中 Timeout 的处理前言最近在项目中要实现一个功能&#xff0c;是关于 Timeout 的&#xff0c;主要是要在要在 TCP 连接建立的时间 和 整个请求完成的时间&#xff0c;在这两个时间层面上&#xff0c;如果超出了设置的时间&#xff0c;就抛出异常&#xff0c;程序中断。研究…

[CodeJam 2021 Round 3] Square Free(调整法 / 字典序最小解网络流)

CodeJam 2021 Round3 Square Freeproblemsolutioncodecode-stdproblem 神奈子是个很爱打麻将的老婆婆&#xff0c;有一天她把她的麻将放进了一个 nmn\times mnm 的网格图里&#xff0c;每个麻将可以左斜着放入网格中&#xff08;如 / &#xff09;&#xff0c;也可以右斜着&am…

ConsurrentDictionary并发字典知多少?

在上一篇文章你真的了解字典吗?一文中我介绍了Hash Function和字典的工作的基本原理.有网友在文章底部评论,说我的Remove和Add方法没有考虑线程安全问题.https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2?redirectedfromMSDN&viewn…

ASP.NET Core 基于JWT的认证(二)

上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍&#xff0c;这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用。.Net Core 2.2Visual Studio 2017ASP.NET Core WebAPI2在上一篇文章中&#xff0c;我们详细的介绍了JWT的知识&#xff0c;这…

Docker最全教程之Go实战,墙裂推荐(十九)

前言与其他语言相比&#xff0c;Go非常值得推荐和学习&#xff0c;真香&#xff01;为什么&#xff1f;主要是可以直接编译成机器代码&#xff08;性能优越&#xff0c;体积非常小&#xff0c;可达10来M&#xff0c;见实践教程图片&#xff09;而且设计良好&#xff0c;上手门槛…

你注意到 .Net Framework 和 .Net Core 中使用 Session 的区别了吗?

在测试一个例子时发现的问题&#xff0c;这个示例实现的功能是刷新页面也能保持表格锁定列的状态&#xff0c;先看下页面的完成效果&#xff1a;测试中发现&#xff0c;几乎相同的代码&#xff1a;在 FineUIMvc&#xff08;Net Framework&#xff09;下没有问题&#xff1a;htt…

一键发布部署vs插件[AntDeploy]开源了

deploy to remote server by one button click功能支持docker一键部署(支持netcore)支持iis一键部署(支持netcore和framework)(支持增量发布)(支持一键回滚)(支持点火)支持windows服务一键部署(支持netcore和framework)(支持增量发布)(支持一键回滚) 使用插件前我要发布一个net…

【学习笔记】平等博弈及常见的公平博弈类型

文章目录平等博弈nim堆SG定理nim和常见的公平博弈模型bash博弈nim博弈nim-k博弈wythoff博弈扩展wythoff博弈fibonacci博弈阶梯博弈green hackenbushMisre Nim博弈Every-SGnim积翻棋子游戏游戏的积&#xff0c;tartan定理平等博弈 G{L∣R},LRG\{L|R\},LRG{L∣R},LR&#xff0c;所…

Excel催化剂开源第31波-pdf相关功能实现及类库介绍

在Excel催化剂刚推出的pdf相关功能中&#xff0c;反馈很热烈&#xff0c;不止是用户层面好多人喜欢&#xff0c;也听到在.NET开发群里有询问pdf在winform上展现的功能诉求&#xff0c;一段时间没写开源篇&#xff0c;生怕大家以为Excel催化剂太小气了&#xff0c;不再开发了&am…

[小技巧]ASP.NET Core中如何预压缩静态文件

原文地址&#xff1a;Pre-compressed static files with ASP.NET Core作者&#xff1a;Gunnar Peipman译者&#xff1a;Lamond Lu译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10552131.html示例代码&#xff1a;https://github.com/lamondlu/CompressedStaticFileSample…

【学习笔记】简单的连通性状压DP——插头DP(不学以为是天书)

文章目录哈希链表插头DP概念括号表示法 / 最小表示法例题洛谷插头dp板题CITYParkIITonys TourEfficient Tree[CQOI2015]标识设计哈希链表 众所周知&#xff0c;哈希是有冲突的可能性的&#xff0c;而且在状态数越多&#xff0c;冲突的概率就越高。目前掌握的处理方案有多哈希&…

[NewLife.XCode]实体类详解

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

Counting Triangles

Counting Triangles 题意&#xff1a; 给你一个完全图&#xff0c;每个边被赋值为0或1&#xff0c;问这个完全图中有多少个完美三角形&#xff1f; 完美三角形定义&#xff1a;三角形的三边都为0或1 题解&#xff1a; 正着求不好求&#xff0c;我们可以倒着想 不考虑完美&a…

程序员过关斩将--论商品促销代码的优雅性

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;YY说你帮她解决了几个问题&#xff0c;也帮我解决一个呗原来是D妹子&#xff0c;来坐我身边&#xff0c;说下情况我的项目是个电商项目&#xff0c;现在产品狗要给商品做活动正常呀我一个新手初来咋到顶不住压力了&…

Math(牛客多校第三场)

Math 题意&#xff1a; 问你有多少对(x,y),1<x<y<n,满足(x2 y2)%(xy1) 0 题解&#xff1a; 这种题。。。直接打表芜湖~ 通过打表发现&#xff1a;满足情况的为(i,i * i * i),但是也有不和谐的声音出现&#xff1a;当x8时&#xff0c;会出现两个&#xff0c;一个…

[NewLife.XCode]增删改查入门

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

在实际项目中使用LiteDB NoSQL数据库

LiteDB 是一个 NoSQL 数据库&#xff0c;特点是 MongoDB like 和 0 配置。100% 原汁原味的 C# 开发, Release 只有一个 DLL&#xff0c;官方有一下适用场景&#xff1a;移动App&#xff0c;桌面小应用程序&#xff0c;特有的文件格式&#xff0c;小型的 Web 应用&#xff0c;需…

初探奥尔良(Orleans)

由于工作上关系目前经常被各种并发数据问题搞得焦头烂额&#xff0c;要么要性能舍弃数据上得一致性&#xff0c;要么要一致性但是却得到了特别糟糕的响应。难道鱼和熊掌真的无法兼得吗&#xff1f;然后找到了类似奥尔良这种基于Actor模型的kuangjia首先本人因为是C#系的所以暂不…

[NewLife.XCode]功能设置

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代表作有百亿级大数据实时计算项…