AtCoder Regular Contest 127 B - Ternary Strings(构造)

传送门

题意:

构造 3 × n 3 \times n 3×n 个长度为 l l l 的字符串,每一位只有 0 , 1 , 2 0,1,2 0,1,2 三个数字,且满足第 i i i 位一共有 n n n 0 0 0, n n n 1 1 1 , n n n 2 2 2

并且使得这些字符串中字典序最大的字符串字典序尽可能小。

题解:

1 1 1 位一定有 n n n 2 2 2 ,考虑三进制,那么字典序最大的字符串 t t t ≥ 2 × 3 l − 1 + n − 1 \geq 2 \times 3^{l-1} +n-1 2×3l1+n1

我们可以使得 t = 2 × 3 l − 1 + n − 1 t=2 \times 3^{l-1} +n-1 t=2×3l1+n1​ ,并且一定能构造出满足题意的字符串。

我们只需让已经构造出来的以 2 2 2为开头的字符串以如下形式变换:

1.0 − > 1 1.0->1 1.0>1 1 − > 2 1->2 1>2 2 − > 0 2->0 2>0

2. 2. 2. 0 − > 2 0->2 0>2 1 − > 0 1->0 1>0 2 − > 1 2->1 2>1

假设以 2 2 2​开头第 i i i​ 位有 x x x​ 个 0 0 0​ ,那么 1 1 1​, 2 2 2​ 总共有 n − x n-x nx​ 个,经过上述变换,就可以满足最终 0 0 0 的个数有 x + n − x = n x+n-x=n x+nx=n

代码:

#pragma GCC diagnostic error "-std=c++11"
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<ctime>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int MAXN=5e5+5;
const int inf=0x3f3f3f3f;
int ans[MAXN][20];
int main()
{
    int n,l;
    cin >> n >> l;
    ll x = 2 * pow(3, l - 1);
    for (int i = 1; i <= n;i++){
        ll tp = x;
        vector<int> v;
        for (int j = 1; j <= l;j++){
            v.push_back(tp % 3);
            tp /= 3;
        }
        reverse(v.begin(), v.end());
        x++;
        for (int j = 1; j <= l;j++){
            ans[i][j] = v[j - 1];
        }
    }
    for (int i = 1; i <= n;i++){
        for (int j = 1; j <= l;j++){
            if(ans[i][j]==0){
                ans[i + n][j] = 1;
                ans[i + n * 2][j] = 2;
            }
            else if(ans[i][j]==1){
                ans[i + n][j] = 2;
                ans[i + n * 2][j] = 0;
            }
            else{
                ans[i + n][j] = 0;
                ans[i + n * 2][j] = 1;
            }
        }
    }
    for (int i = 1; i <= 3 * n;i++){
        for (int j = 1; j <= l;j++){
            printf("%d", ans[i][j]);
        }
        printf("\n");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AtCoder Practice Contest #B - インタラクティブ練習 (Interactive Sorting) 是一道比较有趣的题目。它是一道交互式的排序题目,需要你与一个神秘程序进行交互,以便将一串无序的数字序列排序。 具体来说,这个神秘程序会给你一个长度为 $N$ 的数字序列,然后你需要通过询问它两个数字的大小关系,来逐步确定这个序列的排序顺序。每次询问之后,神秘程序都会告诉你两个数字的大小关系,比如第一个数字比第二个数字小,或者第二个数字比第一个数字小。你需要根据这个信息,来调整这个数字序列的顺序,然后再向神秘程序询问下一对数字的大小关系,以此类推,直到这个数字序列被完全排序为止。 在这个过程中,你需要注意以下几点: 1. 你最多只能向神秘程序询问 $Q$ 次。如果超过了这个次数,那么你的程序会被判定为错误。 2. 在每次询问之后,你需要及时更新数字序列的顺序。具体来说,如果神秘程序告诉你第 $i$ 个数字比第 $j$ 个数字小,那么你需要将这两个数字交换位置,以确保数字序列的顺序是正确的。如果你没有及时更新数字序列的顺序,那么你的程序也会被判定为错误。 3. 在询问的过程中,你需要注意避免重复询问。具体来说,如果你已经询问过第 $i$ 个数字和第 $j$ 个数字的大小关系了,那么你就不需要再次询问第 $j$ 个数字和第 $i$ 个数字的大小关系,因为它们的大小关系已经被确定了。 4. 在排序完成之后,你需要将排序结果按照从小到大的顺序输出。如果你输出的结果不正确,那么你的程序也会被判定为错误。 总的来说,这道题目需要你熟练掌握交互式程序设计的技巧,以及排序算法的实现方法。如果你能够熟练掌握这些技巧,那么就可以顺利地完成这道非传统题了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值