社区讨论

蒟蒻求助

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 条回复,欢迎继续交流。

正在加载回复...