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("%d\n",I=n+1>>1);
        for(int i=0; i<I; ++i)printf("%d %d\n",i*3+1,n*3-i*3);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q619718

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值