2021 Niu Guest Winter Holiday 알고리즘 기본 훈련 캠프 1 B, I (구조)

주제 링크 : B 대괄호 , 나는 프라임이 아닌 쌍의 배열을 제한합니다.

B 브래킷

이야기

  • "()"하위 시퀀스의 수가 n이되도록 비어 있지 않은 대괄호 문자열을 구성합니다.
  • 문자열의 길이는 1e5를 초과하지 않습니다.

아이디어

  • 같은 길이는 10, 5 * 5> 4 * 6이고 정사각형이 크므로 근수 n으로 시작합니다.
  • 먼저 루트 번호 n 왼쪽 괄호를 출력 한 다음 d1 = n / 루트 번호 n 오른쪽 괄호가 있고, d2 = n %가 왼쪽 괄호에 루트 번호 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;
}

비 프라임 쌍의 배열을 제한합니다.

이야기

  • 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이고, 그런 다음 ai + 1에서 k + 1 홀수를 출력합니다. 마지막 남은 숫자는 처음부터 출력됩니다. 1 2 3 ...
  • 예 : 12 2-> 12 10 8 | 7 9 11 | 12 34 5 6 (3 개 부분), 11 3-> 11 | 10 8 6 4 | 3 5 7 9 | 12 (4 개 부분), 10 5-> 3 | 6 4 2 8 10 | 15 7 9 (세 부분)
  • 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