首页 > 其他分享 >CF1864B Swap and Reverse

CF1864B Swap and Reverse

时间:2023-08-29 11:14:21浏览次数:43  
标签:奇偶 ch Reverse 奇数 int 偶数 CF1864B Swap 操作

思路

刚看懂题意时感觉很难,但是观察样例后,大胆猜测,\(k\) 为偶数时,直接排序;\(k\) 为奇数时,分奇偶位排序。

快速了写了程序,一交果然 AC。

其实很简单,这里给出证明:

首先,操作 \(1\) 保证了奇数位和偶数位上的字符可以任意变动顺序。

然后,操作 \(2\) 当 \(k\) 为偶数时,可以改变一个字符的位置的奇偶性,可以先通过操作 \(2\) 把字符放在应该的奇偶位上,再用操作 \(1\) 即可,因为 \(k<n\) 所以不会出现没办法使用操作 \(2\) 的情况,但是操作 \(2\) 一次会改变 \(k\) 个字符的奇偶性,如何证明一定可以把所有的字符的位置都改变成想要的奇偶呢?因为 \(k<n\) 且 \(k\) 为偶数,所以一定有奇偶位可以不在某次操作 \(2\) 的范围内,所以可以把要转换的字符经过操作 \(2\) 后,移出去,然后再进行一次操作 \(2\) 把其他字符再转换回去,等于一次交换了两个字符的位置的奇偶性,因为需要调整的奇偶性一定是成对的,所以一定可以交换到自己想要的奇偶性位置。

其次,是操作 \(2\) 当 \(k\) 为奇数时,因为 \(k\) 为奇数,所以无法改变奇偶性,所以只能按位置分奇偶排序。

AC code

#include<bits/stdc++.h>
using namespace std;
int T,n,m;
char ch[100005],s1[50005],s2[50005]; 
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%s",&n,&m,ch+1);
		if(m%2==0){sort(ch+1,ch+n+1),printf("%s\n",ch+1);continue;}
		for(int i=1;i<=n;++i)
		{
			if(i%2) s1[(i+1)/2]=ch[i];
			else s2[i/2]=ch[i];
		}
		sort(s1+1,s1+(n+1)/2+1),sort(s2+1,s2+n/2+1);
		for(int i=1;i<=n/2;++i) printf("%c%c",s1[i],s2[i]);
		if(n%2) printf("%c",s1[(n+1)/2]);
		puts("");
	}
	return 0;
}

标签:奇偶,ch,Reverse,奇数,int,偶数,CF1864B,Swap,操作
From: https://www.cnblogs.com/One-JuRuo/p/17664234.html

相关文章

  • linux下vi或vim操作Found a swap file by the name的原因及解决方法--九五小庞
    在linux下用vi或vim打开Test.java文件时[root@localhosttmp]#viTest.java出现了如下信息:E325:ATTENTIONFoundaswapfilebythename".Test.java.swp"ownedby:rootdated:WedDec713:52:562011filename:/var/tmp/Test.javamo......
  • DWR的注释(annotations)使用及反向调用(Reverse Ajax)
    先说说注释语法,省掉dwr.xml。(自从用了java5之后,现在越看一堆堆的配置文件越烦,越来越喜欢注释方式来的直接简单了)  首先下载最新的稳定版本的dwr.jar文件放到你的工程中。(还有需要其它的吗?不需要了,dwr就是这么简单)然后在web.xml中添加如下一段<!--DWRServlet--><servle......
  • 从 Python3.11 新增 SWAP 字节码到基础语法面试题
    点评:典型的送分考验基础的题目,在其他编程语言中可以使用异或运算的方式来实现交换两个变量的值。但是Python中有更为简单明了的Pythonic做法。条件:不允许使用中间变量@目录方法一使用异或(XOR)运算符方法二使用Python的解包特性(元组解包)来交换变量的值元组解包ROT_......
  • BUGKU逆向reverse 1-8题
    练习IDA两年半打开尘封已久的bugku,从题目中练习使用,现在都已经是新版本了orz入门逆向运行baby.exe将解压后的baby.exe拖到IDA里面主函数中找到mov指令可以看到这里就是flagflag{Re_1s_S0_C0OL}signin下载附件解压之后是sign_in.apk,Android逆向我不会啊orz丢到AndroidKil......
  • reverse_re3
    main函数点击重要函数对if里面的数字按r键,使其从ASCII码转为字符发现wasd四个关键的移动方向键,判断为迷宫问题判断应该是要次数为2,即次数++3(从0开始计数)次才会有flag点进一开始先进入的函数函数出现两个循环,应该是迷宫的大小点进数组dword_202AB0发现没什么......
  • 【刷题笔记】25. Reverse Nodes in k-Group
    题目Givenalinkedlist,reversethenodesofalinkedlistkatatimeandreturnitsmodifiedlist.kisapositiveintegerandislessthanorequaltothelengthofthelinkedlist.Ifthenumberofnodesisnotamultipleofkthenleft-outnodesint......
  • 【刷题笔记】24. Swap Nodes in Pairs
    题目Givenalinkedlist,swapeverytwoadjacentnodesandreturnitshead.Youmaynotmodifythevaluesinthelist'snodes,onlynodesitselfmaybechanged.Example:Given1->2->3->4,youshouldreturnthelistas2->1->4->3.题目......
  • C++快速入门 第四十四讲:函数模板swap使用
    泛型编程技术支持程序员创建函数和类的蓝图(即模板,template),而不是具体的函数和类。标准模板库STL(StandardTemplateLibrary),STL库是泛型编程技术的经典之作,它包含了许多非常有用的数据类型和算法。当拥有一个模板时,编译器将根据模板自动创建一个函数,该函数会使用正确的数据类型......
  • [AGC001F] Wide Swap 题解
    特别有意思的思维题。思路参考题解第一位的神仙思路。将排列\(a_i\)变为\(b_{a_i}\)。限制便变为了只能交换相邻的两个差大于\(k\)的点。那么这个限制就已经与普通排序很相似。考虑使用归并排序。一个点可以跑到其他点的前面要求这一连续段都是比它加\(k\)都不大。......
  • Leetcode 206. 反转链表(Reverse linked list)
    题目链接给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]提示:链表中节点的数目范围是[0,5000]-5000<=Node.val<=5000思路迭代法:创建两个指针,分别指向当前节......