[CSP-S模拟测试]:字符交换(贪心+模拟)

题目传送门(内部题136)


输入格式

  输入文件第一行为两个正整数$n,k$,第二行为一个长度为$n$的小写字母字符串$s$。


输出格式

  输出一个整数,为对字符串$s$进行至多$k$次交换相邻字符的操作后,字符串$s$可能达到的最大的$m$指标。


样例

样例输入:

6 3
abacba

样例输出:

3


数据范围与提示

  对于$40\%$的数据,满足$n\leqslant 10$。
  对于$70\%$的数据,满足$n\leqslant 200$。
  对于$100\%$的数据,满足$1\leqslant n\leqslant 4,000,1\leqslant k\leqslant n^2$。


题解

如果最终连续,那么一定有至少一个字符不动。

于是可以枚举字符,然后将同种字符最小的挪向它即可,用小根堆维护就好了。

其实因为答案满足单调性,所以可以用二分优化。

时间复杂度:$\Theta(n^2)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int N,K;
char ch[4001];
int a[4001];
vector<int> pos[30];
int ans;
int main()
{
	scanf("%d%d",&N,&K);
	scanf("%s",ch+1);
	for(int i=1;i<=N;i++)
	{
		a[i]=ch[i]-‘a‘+1;
		pos[a[i]].push_back(i);
	}
	for(int i=1;i<=26;i++)
	{
		for(int j=0;j<pos[i].size();j++)
		{
			int L=(j==0)?1:pos[i][j-1]+(pos[i][j]-pos[i][j-1]+1)/2;
			int R=(j==pos[i].size()-1)?N:pos[i][j+1]-(pos[i][j+1]-pos[i][j]+1)/2;
			for(int k=L;k<=R;k++)
			{
				int cnt=1;
				int sum=abs(pos[i][j]-k);
				if(sum>K)continue;
				priority_queue<int,vector<int>,greater<int> > q;
				for(int l=0;l<pos[i].size();l++)
				{
					if(l<j)q.push(k-pos[i][l]-j+l);
					if(l>j)q.push(pos[i][l]-k-l+j);
				}
				while(q.size()&&sum+q.top()<=K)
				{
					cnt++;
					sum+=q.top();
					q.pop();
				}
				ans=max(ans,cnt);
			}
		}
	}
	printf("%d",ans);
	return 0;
}


rp++

原文地址:https://www.cnblogs.com/wzc521/p/11830027.html

时间: 2024-10-28 10:32:24

[CSP-S模拟测试]:字符交换(贪心+模拟)的相关文章

[CSP-S模拟测试]:赛(贪心+三分)

题目描述 由于出题人思维枯竭所以想不出好玩的背景.有$n$个物品,第$i$个物品的价格是$v_i$,有两个人,每个人都喜欢$n$个物品中的一些物品.要求选出正好$m$个物品,满足选出的物品中至少有$k$个物品被第一个人喜欢,$k$个物品被第二个人喜欢.并求出最小的价格和. 输入格式 第一行三个数$n,m,k$.第二行$n$个数,第$i$个数表示$v_i$.第三行包含一个数$a$,表示第一个人喜欢的物品数.第四行包含$a$个数,表示第一个人喜欢的物品是哪几个.第五行包含一个数$b$,表示第二个人喜

[CSP-S模拟测试]:Tree(贪心)

题目描述 给定一颗$n$个点的树,树边带权,试求一个排列$P$,使下式的值最大 $$\sum \limits_{i=1}^{n-1}maxflow(P_i,P_{i+1})$$ 其中$maxflow(s,t)$表示从点$s$到点$t$之间的最大流,即从$s$到$t$的路径上最小的边权 输入格式 第一行一个整数$n$,表示点数下接$n−1$行,每行三个数$u,v,w$表示一条连接点$u$和点$v$权值为$w$的边 输出格式 输出一行一个整数,表示答案 样例 样例输入: 21 2 2333 样例输出

[CSP-S模拟测试]:d(贪心+树状数组)

题目传送门(内部题65) 输入格式 第一行,一个自然数$T$,代表数据组数.对于每组数据:第一行,一个正整数$n$,一个自然数$m$.接下来$n$行,每行两个正整数,$a_i,b_i$. 输出格式 对于每组数据,输出一行,一个整数,代表答案. 样例 样例输入: 3 2 0 5 10 5 5 2 1 1 1 2 2 3 1 3 5 4 4 5 3 样例输出: 25412 数据范围与提示 保证$0\leqslant m<n,a_i,b_i\leqslant 10^5$. 题解 题目并不难,考虑贪心,

[CSP-S模拟测试]:优化(贪心+DP)

题目描述 $visit\text{_}world$发现有下优化问题可以用很平凡的技巧解决,所以他给你分享了这样一道题:现在有长度为$N$的整数序列$\{ a_i\}$,你需要从中选出$K$个不想叫的连续子区间(可以存在元素不被选),从左到右记它们的和为$s_1,s_2,...,s_k$,我们的优化目标是最大化下述和式:$$\sum \limits_{i=1}^{k-1}|s_i-s_{i+1}|$$你只需要输出这个最大的和即可. 输入格式 第一行两个整数$N,K$,意义如上.接下来一行$N$个整

[CSP-S模拟测试]:爬(贪心)

题目传送门(内部题134) 输入格式 第一行两个数$N,L$. 接下来$N$行每行两个数$A_i,B_i$. 接下来$N$行每行一个整数$C_i$. 输出格式 一行一个整数表示答案,无解输出$-1$. 样例 样例输入1: 3 96 35 23 1222 样例输出1: 2 样例输入2: 5 203 24 26 38 410 542345 样例输出2: -1 数据范围与提示 对于$40\%$的数据,$N\leqslant 1,000$: 对于额外$20\%$的数据,$B_i=0$: 对于额外$20\

[CSP-S模拟测试]:表达式密码(模拟)

题目传送门(内部题87) 输入格式 从文件$expression.in$中读入数据.输入一行,一个字符串$S$,表示原表达式,保证为合法表达式 输出格式 输出到文件$expression.out$中.一个字符串,表示使表达式结果最大的符号添加方案. 题解 样例输入1: 10+20-30 样例输出1: 10+20-3+0 样例输入2: -3-4-1 样例输出2: -3-4-1 样例输入3: -200+351-1600 样例输出3: -2+0+0+351-1+600 数据范围与提示 设字符串长度为$

[CSP-S模拟测试]:天空龙(模拟)

题目描述 奥西里斯之天空龙很喜欢颜色,有一天他找到了三种颜色——红黄蓝.奥西里斯有$a$个红色,$b$个黄色,$c$个蓝色,他想用画出最好的画,可是需要至少$x$个红色,$y$个黄色和$z$个蓝色,似乎并不够.别担心,奥西里斯会魔法!他可以把任何两个同种颜色转化为一个另一种颜色!请问他能不能完成呢? 输入格式 第一行一个正整数$t$表示数据组数.接下来$t$行每行六个整数分别表示$a,b,c,x,y,z$. 输出格式 每组数据输出一行,如果可以就输出$"YES"$,否则输出$"

[CSP-S模拟测试]:Median(暴力+模拟)

题目描述 定义两个数列: $$S=\{S(1),S(2),...,S(n)\}\text{和}S_2\{S_2(1),S_2(2),...,S_2(n)\}$$ $$S(k)=(p_k\times k)\mod w,where\ p_k\ is\ the\ kth\ prime\ number$$ $$S_2(k)=S(k)+S(\left\lfloor\frac{k}{10}\right\rfloor+1)$$ 令$M(i,j)$表示$S_2(i)$到$S_2(j)$的中位数(个数为奇数就是中

[贪心+模拟] zoj 3829 Known Notation

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5383 Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and computer science.