YACS-2024年4月-乙组-T1
题目
题目描述
给定一个只由
请计算需要进行多少轮交换才能完成调整。
输入
若干
输出
单个整数:表示交换的次数。
数据范围
样例数据
输入: 1100
输出: 3
赛时代码 :
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
bool flag=0;
int cnt=0;
cin>>s;
while(!flag)
{
bool f=1,pos[300005]={};
for(int i=1;i<s.size();i++)
{
if(s[i-1]=='1'&&s[i]=='0')
{
pos[i]=true;
f=0;
}
}
for(int i=1;i<s.size();i++)
{
if(pos[i]==1)
{
s[i]='1';
s[i-1]='0';
}
}
if(!f) cnt++;
else flag=1;
}
cout<<cnt;
return 0;
}
正解思路:
该题其实是逆序对数的一个特殊情况。对每个 0
的个数(不妨记为
本题中考虑每一轮是并行的,粗略看答案大概是
这种形式。但关键是会出现 11
这种情况,导致左边的 1
不得不等若干轮,而等的情况可能是级联产生的,具体过程可能很复杂,如 10111011
。所以不能往这个方向去想,而应该抓住一些整体的量。
对某个 1
的位置(如没有则为
这样,关键就变成求
一旦
则之间有若干个 0
,每个 0
可以帮
这时候
正解代码:
#include<bits/stdc++.h>
using namespace std;
string s;
long long n,wt[300005],nxt[300005],ans;
int main()
{
cin>>s;
n=s.length();
for(long long i=n,k=n+1,cnt=0;i>=1;i--)
{
if(s[i-1]=='0') cnt++;
else
{
nxt[i]=k;
k=i;
wt[i]=max((long long)0,wt[nxt[i]]+1-(nxt[i]-i-1));
if(cnt) ans=max(ans,cnt+wt[i]);
}
}
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异