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

A.

欧拉筛处理出素数
直接3重暴力循环找

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

#define int long long
const int N=1e5+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是之前质数的倍数,说明这个倍数会在后面的循环内被筛去,无需继续循环
        }
    }
}

void solve() {
    get_prime(1000);
    int l,r;cin>>l>>r;
    for(int i=1;i<top;i++){
        for(int j=i+1;j<top;j++){
            for(int k=j+1;k<top;k++){
                if(prime[i]>r){
                    cout<<"-1";
                    return ;
                }
                int tmp=prime[i]*prime[j]*prime[k];
                if(l<=tmp&&tmp<=r){
                  //  cout<<prime[i]<<' '<<prime[j]<<' '<<prime[k]<<'\n';
                    cout<<tmp;
                    return ;
                }
            }
        }
    }
}

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

B.

先存入a,b数组,再放到一起排序
遍历找出答案,记录在数组中的下标
两个下标若不同则在a里面把这两个下标对应的数交换

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

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

struct node{
    int val,fa,id;
}g[N];
bool cmp(node x,node y){
    return x.val<y.val;
}
void solve() {
    int n;cin>>n;
    vector<int>a(n+1),b(n+1);
    for(int i=1;i<=n;i++){
        cin>>a[i];
        g[i].val=a[i];g[i].fa=1;g[i].id=i;
    }
    for(int i=1;i<=n;i++){
        cin>>b[i];
        g[i+n].val=b[i];g[i+n].fa=2;g[i+n].id=i;
    }
    sort(g+1,g+1+2*n,cmp);
    int mi=inf,ida,idb;
    for(int i=2;i<=2*n;i++){
        if(g[i].fa!=g[i-1].fa){
            int cha=abs(g[i].val-g[i-1].val);
            if(cha<mi){
                mi=cha;
                if(g[i].fa==1){
                    ida=g[i].id;
                    idb=g[i-1].id;
                }else{
                    ida=g[i-1].id;
                    idb=g[i].id;
                }
                //cout<<"i="<<i<<'\n';
                //cout<<"ida="<<ida<<' '<<"idb="<<idb<<'\n';

            }
        }
    }
    //cout<<"ida="<<ida<<' '<<"idb="<<idb<<'\n';
    if(ida!=idb)swap(a[ida],a[idb]);
    for(int i=1;i<=n;i++)cout<<a[i]<<' ';
}

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

C.

斐波那契数是指数级增长的,第50个就已经超过1e9了
把n在数列中二分,若能找到3个数则可以

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

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

map<int,int>mp;
vector<int>dp(60);
void solve() {
    vector<int>ans;
    int n;
    cin >> n;
    if(mp[n]){
        cout<<n<<" 0 0\n";
        return ;
    }
    int id=lower_bound(dp.begin()+1,dp.begin()+1+50,n)-dp.begin();
    id--;
    ans.push_back(dp[id]);
    n-=dp[id];
    if(mp[n]){
        cout<<ans[0]<<' ';
        cout<<n<<" 0\n";return ;
    }
    id=lower_bound(dp.begin()+1,dp.begin()+1+50,n)-dp.begin();
    id--;
    ans.push_back(dp[id]);
    n-=dp[id];
    if(mp[n]){
        cout<<ans[0]<<' '<<ans[1]<<' '<<n<<'\n';
        return ;
    }
    cout<<"-1\n";
}


signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

    dp[1]=0;dp[2]=1;mp[1]++;mp[0]++;
    for(int i=3;i<=50;i++){
        dp[i]=dp[i-1]+dp[i-2];
        mp[dp[i]]++;
    }
   // cout<<dp[25];
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

D.

直接计算

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

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

void solve() {
    long double p;cin>>p;
    long double ans=(1-p)*(1-p)*p*p*p+p*p*(1-p)*(1-p)*(1-p);
    cout<<ans;
}

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

E.

模拟

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

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

void solve() {
    string x;cin>>x;
    int sum=0;
    for(int i=2;i<x.size();i++){
        int tmp=x[i]-'0';
        sum=sum*10+tmp;
    }
    int su=(sum+1)/2;
    string s;cin>>s;
    int r=0,p=0;
    int cnt=0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='R')r++;
        else p++;
        cnt++;
        if(r==su){
            cout<<"kou!\n";
            cout<<cnt;
            return ;
        }
        if(p==su){
            cout<<"yukari!\n";
            cout<<cnt;
            return ;
        }
    }
    cout<<"to be continued.\n";
    cout<<s.size();
}

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

I.

分别求两个数组的最大子序列和与最小子序列和,分别相乘取4种情况的最大值

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

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

void solve() {
    int n,m;cin>>n>>m;
    vector<int>a(n+1),b(m+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++)cin>>b[i];
    vector<int>ma_a(n+1),ma_b(m+1);
    vector<int>mi_a(n+1),mi_b(m+1);
    int max_a=-inf,min_a=inf,max_b=-inf,min_b=inf;
    for(int i=1;i<=n;i++){
        if(i==1){
            ma_a[i]=a[i];mi_a[i]=a[i];
        }else{
            ma_a[i]=max(a[i],a[i]+ma_a[i-1]);
            mi_a[i]=min(a[i],a[i]+mi_a[i-1]);
        }
        max_a=max(max_a,ma_a[i]);
        min_a=min(min_a,mi_a[i]);
    }
    for(int i=1;i<=m;i++){
        if(i==1){
            ma_b[i]=b[i];mi_b[i]=b[i];
        }else{
            ma_b[i]=max(b[i],b[i]+ma_b[i-1]);
            mi_b[i]=min(b[i],b[i]+mi_b[i-1]);
        }
        max_b=max(max_b,ma_b[i]);
        min_b=min(min_b,mi_b[i]);
    }
    int ans=max({max_a*max_b,min_a*min_b,max_a*min_b,min_a*max_b});
    cout<<ans;
}


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

posted @ 2024-02-25 16:47  WW爆米花  阅读(10)  评论(0编辑  收藏  举报