社区讨论
蒟蒻求助
P3718[AHOI2017初中组] alter参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo8oxqg2
- 此快照首次捕获于
- 2023/10/27 22:10 2 年前
- 此快照最后确认于
- 2023/10/27 22:10 2 年前
rt
萌新采用了一个似乎完全与题解不沾边的解法
首先在输入的时候处理出每一段连续长度的值,然后放入set中 (不会用multiset)
由于set容器的有序性,故每一次处理的就是set的最后一位.
最后答案也就是set容器的最后一位
code:
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
char a[N];
int n,k,cnt=1,c[N];
set<int >s;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){//输入处理
cin>>a[i];
cnt++;
if(a[i]!=a[i-1]){
s.insert(cnt);
c[cnt]++;cnt=1;
}
}
if(n!=1)if(a[n]==a[n-1])s.insert(cnt),c[cnt]++;//末尾处理
while(k--){
set<int>::iterator it=s.end();
it--;
int t=*it;//最后一位
if(t==1)continue;//全部为1,结束
if(c[t]==1) s.erase(t);//最后一个次数,0不可能出现,因为不会取出
c[t]--;//次数减一
if(t==2)s.insert(1),c[1]+=2;//特判
else if(t&1)s.insert(1),c[1]++,s.insert(t/2),c[t/2]+=2;//最后一位是奇数
else s.insert(1),c[1]++,s.insert(t/2),c[t/2]++,s.insert(t/2-1),c[t/2-1]++;//最后一位是偶数
}
set<int>::iterator it=s.end();it--;//最大的一个数
int t=*it;
cout<<t;
}
期待大佬帮忙/可怜
回复
共 0 条回复,欢迎继续交流。
正在加载回复...