2021 Niu Guest Winter Holiday Algorithm Basic Training Camp 1 B、I(構造)

トピックリンク:Bブラケット非素数ペアの配置を制限します

Bブラケット

トピック

  • 「()」サブシーケンスの数がnになるように、空でないブラケット文字列を作成します
  • 文字列の長さが1e5を超えない

アイデア

  • 同じ長さは10、5 * 5> 4 * 6で、正方形は大きいので、ルート番号nから始めます。
  • 最初にルート番号nの左括弧を出力し、次にd1 = n /ルート番号nの右括弧があり、ルート番号nを括弧に一致させるためにd2 = n%を残し、最後のd2の左側に挿入します。右括弧左括弧は終わりました。

ACコード  

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
    int k; cin >> k;
    if(k == 0){
        cout << ")(" << endl;
        return 0;
    }
    string a;
    int d = sqrt(k); k -= d * d;
    for(int i = 1; i <= d; i ++) a += "(";
    for(int i = 1; i <= d; i ++) a += ")";
    int d1 = k / d, d2 = k % d;
    for(int i = 1; i <= d1; i ++) a += ")";
    for(int i = 0; i < a.size(); i ++){
        if(a.size() - i == d2) cout << "(";
        cout << a[i];
    }
    return 0;
}

I-非素数ペアの配置を制限する

トピック

  • nの完全な順列を作成して、このシーケンスに正確にk個の隣接するペアがあり、2つの数が互いに素ではなく、-1でない場合でも何でも出力できるようにします。
  • 範囲:2≤n≤1e5、0≤k≤n / 2

アイデア

  • n / 2個の偶数があり、互いに素ではありませんが、最大でn / 2-1のペアが互いに素ではないため、2つのケースがあります。
  1. k == n / 2の場合、特定の偶数と互いに素ではない偶数の奇数を見つけます。ここで、3と6の一致が見つかります。次に、最初は3642で、残りのすべての偶数番号8 10 12 ...が出力され、その後にすべての奇数番号1 3 5 ..が続きます。
  2. k <n / 2の場合、nが奇数の場合、最初にnを出力し、次に大きいものから小さいものまでk + 1の偶数を出力し、k + 1の偶数はaiであり、次にai +1からk + 1の奇数を出力します。最後の残りの数字は最初から出力されます12 3 .. ..
  • たとえば、12 2-> 12 10 8 | 7 9 11 | 1 2 3 4 5 6(3つの部分)、11 3-> 11 | 10 8 6 4 | 3 5 7 9 | 1 2(4つの部分)、10 5-> 3 | 6 4 2 8 10 | 1 5 7 9(3つの部分)
  • 1は互いに素であるため、(2 1)、(3 1)、(4 2)、(5 2)は存在しないと言われています。

ACコード

#include<bits/stdc++.h>
using namespace std;
#define ll long long
vector<int> ans;
int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    if((n==4||n==5)&&m==2){
        puts("-1");
        return 0;
    }
    if((n == 2 || n == 3 ) && m == 1){
        puts("-1");
        return 0;
    }
    if(m < n / 2){
        if(n & 1) ans.push_back(n);
        int st = n / 2 * 2; //最大的偶数
        for(int i = 0; i <= m; i ++){ //m+1个偶数,m对不互质
            ans.push_back(st);
            st -= 2;
        }
        st ++; //m+1个奇数,与上面偶数对应,相差1
        for(int i = 0; i <= m; i ++){
            ans.push_back(st);
            st += 2;
        }
        int dd = n - (m + 1) * 2; //剩下的数
        if(n & 1) dd --; //如果n是奇数,开头输出n,那么剩下的数-1
        for(int i = 1; i <= dd; i ++){
            ans.push_back(i);
        }
    }else{
        ans.push_back(3);
        ans.push_back(6);
        ans.push_back(4);
        ans.push_back(2);
        for(int i = 8; i <= n; i += 2) ans.push_back(i);
        for(int i = 1; i <= n; i += 2){
            if(i == 3) continue; //之前输出过
            ans.push_back(i);
        }
    }
    for(int i = 0; i < ans.size(); i ++){
        if(i) cout << " ";
        cout << ans[i];
    }
    cout << endl;
    return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_43911947/article/details/113531506