首页 > 编程语言 >2024牛客寒假算法基础集训营5

2024牛客寒假算法基础集训营5

时间:2024-02-21 20:45:12浏览次数:38  
标签:prime int 质数 long 2024 牛客 left 集训营 define

A.

总数-1的个数

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n;cin>>n;
    int ans=0;
    for(int i=1,x;i<=n;i++){
        cin>>x;
        if(x==1)continue;
        ans++;
    }
    cout<<ans;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

B.

第一个数能放的都放在前面,然后后面的数取相邻间最小的
最后一个数最后也可以放

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n;cin>>n;
    vector<int>a(n+2);
    for(int i=1;i<=n;i++)cin>>a[i];
    a[0]=inf;a[n+1]=inf;
    int last=inf;
    int ans=0;
    for(int i=1;i<=n;i++){
        if(last>=a[i]){
            ans+=a[i]-1;
            last=0;
        }else{
            ans+=last;
            last=a[i]-last-1;
        }
    }
    if(last)ans+=last;
    cout<<ans;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

G.

n方去枚举每个数与哪些数可以满足条件,然后二分图跑

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e6+10;
#define inf 0x3f3f3f3f

bool is_prime[N];//是否是质数,0为是,1为不是
int prime[N];//质数数组
int top=1;//质数的下标
int min_p[N];//最小质因数数组
void get_prime(int n){
    for(int i=2;i<=n;i++){
        if(!is_prime[i]){//是质数
            prime[top]=i;//存质数
            min_p[i]=i;//质数的最小质因数是本身
            top++;//下标后移
        }
        for(int j=1;j<top;j++){//最小到达遍历质数数组
            if(i*prime[j]>n)break;
            is_prime[i*prime[j]]=1;//标记质数的倍数即合数
            min_p[i*prime[j]]=prime[j];//质数的倍数的最小质因数是该质数
            if(i%prime[j]==0)break;//若i是之前质数的倍数,说明这个倍数会在后面的循环内被筛去,无需继续循环
        }
    }
}
vector<int>l[N/2];//边信息
int boy[N/2];//匹配信息
int used[N/2];//标记数组
int k,m;//配对信息,m点集,n点集
bool find(int i){
    for(int j=0;j<l[i].size();j++){
        if(!used[l[i][j]]){
            used[l[i][j]]=1;
            if(!boy[l[i][j]]||find(boy[l[i][j]])){
                boy[l[i][j]]=i;
                return true;
            }
        }
    }
    return false;
}
void solve() {
    int n;cin>>n;
    get_prime(2*n+10);
    //vector<int>ans(n+1);//vis(n+1,0);
    //int cnt=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            // if(vis[j])continue;
            if(is_prime[i+j]==0){
                l[i].push_back(j);
            }
        }
    }
    memset(boy,0,sizeof(boy));
    int sum=0;
    for(int i=1;i<=n;i++){
        memset(used,0,sizeof(used));
        if(find(i))sum++;
    }
    if(sum>=n){
        for(int i=1;i<=n;i++)cout<<boy[i]<<' ';
        cout<<'\n';
    }else cout<<"-1\n";
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

H.

1-n的顺序序列,相差为1
让n从1开始遍历到谁能够得到质数
比如n+3是质数,那么n-1和4也一定是质数
这样两两配对后若还有1个数,则把这个数和与n配对的那个数之前的那些数暴力二分图

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e6+10;
#define inf 0x3f3f3f3f

bool is_prime[N];//是否是质数,0为是,1为不是
int prime[N];//质数数组
int top=1;//质数的下标
int min_p[N];//最小质因数数组
void get_prime(int n){
    for(int i=2;i<=n;i++){
        if(!is_prime[i]){//是质数
            prime[top]=i;//存质数
            min_p[i]=i;//质数的最小质因数是本身
            top++;//下标后移
        }
        for(int j=1;j<top;j++){//最小到达遍历质数数组
            if(i*prime[j]>n)break;
            is_prime[i*prime[j]]=1;//标记质数的倍数即合数
            min_p[i*prime[j]]=prime[j];//质数的倍数的最小质因数是该质数
            if(i%prime[j]==0)break;//若i是之前质数的倍数,说明这个倍数会在后面的循环内被筛去,无需继续循环
        }
    }
}
vector<int>l[N/2];//边信息
int boy[N/2];//匹配信息
int used[N/2];//标记数组
int k,m;//配对信息,m点集,n点集
bool find(int i){
    for(int j=0;j<l[i].size();j++){
        if(!used[l[i][j]]){
            used[l[i][j]]=1;
            if(!boy[l[i][j]]||find(boy[l[i][j]])){
                boy[l[i][j]]=i;
                return true;
            }
        }
    }
    return false;
}
void solve() {
    int n;cin>>n;
    get_prime(2*n+10);
    //vector<int>ans(n+1);//vis(n+1,0);
    //int cnt=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            // if(vis[j])continue;
            if(is_prime[i+j]==0){
                l[i].push_back(j);
            }
        }
    }
    memset(boy,0,sizeof(boy));
    int sum=0;
    for(int i=1;i<=n;i++){
        memset(used,0,sizeof(used));
        if(find(i))sum++;
    }
    if(sum>=n){
        for(int i=1;i<=n;i++)cout<<boy[i]<<' ';
        cout<<'\n';
    }else cout<<"-1\n";
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

I.

模拟

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int t,a,k;cin>>t>>a>>k;
    if(t==0){
        cout<<abs(a);
        return ;
    }
    if(a==0){
        cout<<abs(t);
        return ;
    }
    if(t>0&&a>0){
        if(t>=a){
            cout<<t;
        }else {
            cout<<(a+(a-t));
        }
        return ;
    }
    if(t<0&&a<0){
        t=-t;a=-a;
        if(t>=a){
            cout<<t;
        }else {
            cout<<(a+(a-t));
        }
        return ;
    }
    if(abs(a)<=k){
        cout<<(2*abs(a)+abs(t));
    }else{
        cout<<(3*abs(t)+2*abs(a));
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    //cin>>left;
    while(left--){
        solve();
    }
}

M.

考虑如何分割
要么竖着切割,要么错位1个分割
两种方法都跑,能1次解决就一次,最多两次
特判n=1和2

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=1e5+10;
#define inf 0x3f3f3f3f

void solve() {
    int n;cin>>n;
    vector<int>a(n+1),b(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    if(n==1){
        cout<<"-1\n";return ;
    }
    if(n==2){
        if(a[1]==b[1]) {
            cout << "-1\n";
            return;
        }
        cout<<"1\n";return ;
    }
    for(int i=2;i<=n-1;i++){
        if(a[i]==b[i]){
            cout<<"1\n";return ;
        }
    }
    for(int i=1;i<n;i++){
        if(a[i]==b[i+1]||b[i]==a[i+1]){
            cout<<"1\n";return ;
        }
    }
    cout<<"2\n";
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

标签:prime,int,质数,long,2024,牛客,left,集训营,define
From: https://www.cnblogs.com/wwww-/p/18026169

相关文章

  • 2024牛客寒假算法基础集训营5
    2024牛客寒假算法基础集训营5比赛链接赛时出了五题,被自己不严谨的思维害惨了,之后的题晚几天再补,要开学了A.mutsumi的质数合数思路既不是质数也不是合数恐怕非1莫属了吧Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()......
  • 2024初三年后集训模拟测试3
    前言比赛链接难度不好说,感觉是东拼西凑的题,但是除了\(T1\)都不简单。\(T1~100pts:\)贪心+四边形不等式。\(T2~70pts:\)读假题了,是最大\(w_i\)不是固定\(w_i\),做法是二分答案+DP,不过需要单调队列优化,不会这玩意儿赛后学了好久\(qwq\)。但是读假题了还能拿......
  • weblogic CVE-2024-20931分析
    weblogic12.2.1.4.0安装我的环境:ubuntu22.04+weblogic12.2.1.4.0+jdk8(注:weblogic不支持OpenJDK)jdk下载安装:https://www.oracle.com/cn/java/technologies/downloads/archive/weblogic下载安装:https://www.oracle.com/middleware/technologies/weblogic-server-install......
  • 2024年!vscode和clangd的配置
    前言Ubuntu20系统下,使用vscode和clangd来进行代码补全和拼写检查.安装vscode直接从Ubuntu的应用商店下载vscode.安装clangd$sudoaptinstallclangd安装vscode插件-clangdvscode安装clangd插件不需要对clangd插件进行配置.不需要对clangd插件进......
  • 【CVE-2024-21626】容器逃逸漏洞修复
    哈喽大家好,我是咸鱼。好久不见,最近有一个很火的CVE——runc容器逃逸漏洞。年前的时候我们已经在测试环境进行了相关操作打算年后线上进行修复。因为今天咸鱼才开工,所以文章也就拖到了现在......
  • 2024-02-21 js 工具类(一行代码)
    1.获取浏览器Cookie的值constcookie=name=>`;${document.cookie}`.split(`;${name}=`).pop().split(';').shift();cookie('_ga');//Result:"GA1.2.1929736587.1601974046"2.将RGB转换为十六进制constrgbToHex=(r,g,b)=>&......
  • 20240221总结
    P4311士兵占领考虑先把棋盘放满,判掉无解,并把问题转化为拿走最多的棋子。这个问题就一眼最大流了,对于行和列分别建M,N个节点,源点向行节点连流量为该行最多可删个数的边,列节点向汇点连该列最多可删个数的边,对于每个可放士兵的(i,j),从行节点i向列节点j连一条流量为1的边,跑最大流......
  • 2024.2.21 LGJ Round
    A你在平面上有\(n\)个点,你每次可以从一个点跳到其右下或左上任意的点,|对每个点\(i\),求所有点到\(i\)至少跳多少次的和。点的坐标值域为\(M=2500\)。\(n\le2.5e5\).我们先考虑某个点,到所有点跳多少次。首先右下,左上都是跳一次即可。我们先考虑右上的点怎么办。我们一定......
  • 2024年2月中国数据库排行榜:PolarDB夺魁首登顶,TiDB攀升回探花
    银装素裹覆大地,春意初醒待来临。2024年2月墨天轮中国数据库流行度榜单出炉,表现最亮眼的无疑是PolarDB,其自23年7月以来一路高歌猛进,此次更是一举夺魁,彰显了云原生数据库的蓬勃发展态势,OceanBase、TiDB紧接拿下榜眼探花。榜单前十中,开源与商业平分秋色、各家数据库乘云直上,你追我赶......
  • 2024牛客寒假算法基础集训营4
    2024牛客寒假算法基础集训营4比赛地址A.柠檬可乐思路:简单的模拟,按照题目描述判断大小即可Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()+1,x.end()voidsolve(){ inta,b,k; cin>>a>>b>>k; if(a>=k*b)cout<<&qu......