banban

阅读: 评论:0

banban

banban

给你一个整数n。 让我们把s(n)定义为字符串 "BAN "连接了n次。例如,s(1) = "BAN",s(3) = "BANBANBAN"。注意,字符串s(n)的长度等于3n。 考虑一下s(n)。你可以对s(n)进行如下操作,次数不限(可能为零)。 选择任何两个不同的指数i和j(1≤i,j≤3n,i≠j)。 然后,交换s(n)i和s(n)j。 你希望字符串 "BAN "作为一个子序列不出现在s(n)中。为了达到这个目的,你要做的最小的操作数是什么?另外,请找出一个这样的最短操作序列。 如果一个字符串a可以通过删除几个(可能是0个或全部)字符从b中得到,那么这个字符串就是一个字符串b的子序列。 输入 输入由多个测试案例组成。第一行包含一个整数t(1≤t≤100)--测试案例的数量。接下来是对测试用例的描述。 每个测试用例的唯一一行包含一个整数n(1≤n≤100)。 输出 对于每个测试案例,在第一行输出m(0≤m≤105)--所需的最小操作数。保证在问题的约束下,目标总是可以在最多105次操作中实现。 然后,输出m行。其中第k行应该包含两个整数ik, jk (1≤ik,jk≤3n,ik≠jk),表示你想在第k次操作中交换索引ik和jk的字符。 在所有的m个操作之后,"BAN "不能作为一个子序列出现在s(n)中。 如果有多个可能的答案,请输出任何一个。 例子 输入复制 2 1 2 输出拷贝 1 1 2 1 2 6 注意 在第一个测试案例中,s(1)="BAN",我们可以交换s(1)1和s(1)2,将s(1)转换为 "ABN",它不包含作为子序列的 "BAN"。 在第二个测试案例中,s(2)="BANBAN",我们可以交换s(2)2和s(2)6,将s(2)转换为 "BNNBAA",其子序列不包含 "BAN"。 

分析,将边缘两组的第一个和最后一个交换

#include <iostream>
using namespace std;int main() {int T,n,I;cin>>T;while(T--) {scanf("%d",&n);printf("%dn",I=n+1>>1);for(int i=0; i<I; ++i)printf("%d %dn",i*3+1,n*3-i*3);}
}

 

本文发布于:2024-01-28 10:27:33,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064088596765.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:banban
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23