蒟蒻求助
查看原帖
蒟蒻求助
293498
My_hanshuang楼主2022/7/1 12:34

rt

萌新采用了一个似乎完全与题解不沾边的解法

首先在输入的时候处理出每一段连续长度的值,然后放入set中 (不会用multiset) 由于set容器的有序性,故每一次处理的就是set的最后一位. 最后答案也就是set容器的最后一位 code:


#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;
}

期待大佬帮忙/可怜

2022/7/1 12:34
加载中...