第一场

准备整理一下知识点了,之前说要刷kuangbin的提单(全绿)结果dp还没写完。先把牛客的比赛补一补吧,不想签到了。

B 括号

找规律的题,一开始想的是一个左括号,其余右括号,有个数限制。所以拆成 a 个左括号,b 个右括号,但是需要 ab=k,有些k不能拆成 (a+b<=1e5) 满足条件的 a 和 b ,所以先对 k -> sqrt(k),向下取整,然后做除做余,余表示 m—m=k-ab ,放到最左边,然后加一个右括号匹配,再放 a-m个 左括号,再放 b 个右括号—(a-m)b+mb 完成匹配。

#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
const int mod=1e9+7;
typedef long long ll;
ll k;
int main(){
    
    
    cin>>k;
    if(k==0){
    
    
        cout<<")(";
        return 0;
    }
    ll p=sqrt(k);
    ll r=k/p;
    ll l=k%p;
    for(int i=0;i<l;i++) cout<<"(";
    cout<<")";
    for(int i=l;i<p;i++) cout<<"(";
    for(int i=0;i<r;i++) cout<<")";
    return 0;
}

I 限制不互素对的排列

赛中想到了,写了个寂寞,先分奇数偶数,偶数gcd一定不唯一(都能被2整除)然后还可以加两个值,就挑最小的3—6,5—10两对,放在两边。最后按需构造就好了。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int f[maxn];
int vis[maxn];
int main(){
    
    
    int n,k;
    cin>>n>>k;
    if(n<=5&&k==n/2) cout<<-1;
    else{
    
    
        vector<int> ve;
        if(k==n/2){
    
    
            for(int i=2;i<=n;i+=2){
    
    
                if(i==6) continue;
                ve.push_back(i);
            }
            ve.push_back(6);
            ve.push_back(3);
            for(int i=1;i<=n;i+=2){
    
    
                if(i==3) continue;
                ve.push_back(i);
            }
        }else{
    
    
            for(int i=2;i<=2*k+2;i+=2){
    
    
                ve.push_back(i);
            }
            for(int i=1;i<=2*k+2;i+=2){
    
    
                ve.push_back(i);
            }
            for(int i=2*k+3;i<=n;i++){
    
    
                ve.push_back(i);
            }
        }
        for(int i=0;i<ve.size();i++){
    
    
            cout<<ve[i]<<" ";
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/iuk11/article/details/113872066