Алгоритм базового тренировочного лагеря 1 B, I для гостей Зимних праздников Ню 2021 (структура)

Ссылка на тему: B скобки , я ограничиваю расположение непростых пар

B-скоба

Тема

  • Создайте непустую скобку так, чтобы количество подпоследовательностей "()" было n
  • Длина строки не превышает 1e5

Идеи

  • Такая же длина 10, 5 * 5> 4 * 6, квадрат большой, поэтому начните с корня n
  • Сначала выведите число корня n в скобках, затем в скобках d1 = n / число корня n, и оставьте d2 = n%, чтобы сопоставить число корня n в скобках, затем вставьте его слева от последнего d2 правая скобка правой скобки Левая скобка закрывается.

код переменного тока  

#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 смежных пар, и эти два числа не были взаимно простыми и могли выводить что угодно, если не -1.
  • Диапазон: 2≤n≤1e5, 0≤k≤n / 2

Идеи

  • Есть n / 2 четных чисел, и четные числа не являются относительно простыми, но существует не более n / 2-1 пар, которые не являются относительно простыми в четных числах, поэтому есть два случая
  1. Когда k == n / 2, тогда найдите четное нечетное число, которое не является взаимно простым с некоторым четным числом.Здесь мы находим совпадение 3 и 6. Затем начинается 3642, затем выводятся все оставшиеся четные числа 8 10 12 ..., за которыми следуют все нечетные числа 1 3 5 ...
  2. Когда k <n / 2, если n нечетно, сначала выведите n, затем выведите k + 1 четных чисел от большого к маленькому, четное число k + 1 равно ai, а затем выведите k + 1 нечетных чисел из ai + 1, Последнее оставшееся число выводится с начала 1 2 3 ...
  • Например, 12 2-> 12 10 8 | 7 9 11 | 1 2 3 4 5 6 (три части), 11 3-> 11 | 10 8 6 4 | 3 5 7 9 | 1 2 (четыре части), 10 5-> 3 | 6 4 2 8 10 | 1 5 7 9 (три части)
  • Поскольку 1 взаимно просто с любым числом, говорят, что (2 1), (3 1), (4 2), (5 2) не существуют

код переменного тока

#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