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

题目链接

A.

因为判断要素较少,直接条件模拟

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

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

void solve() {
    int n;cin>>n;
    string s;cin>>s;
    int D=0,F=0,S=0,d=0,f=0,ss=0;
    for(int i=0;i<s.size();i++){
        if(s[i]=='D')D=1;
        else if(s[i]=='F'&&D==1)F=1;
        else if(s[i]=='S'&&F==1)S=1;
        if(s[i]=='d')d=1;
        else if(s[i]=='f'&&d==1)f=1;
        else if(s[i]=='s'&&f==1)ss=1;
    }
    if(D&&F&&S)cout<<1<<' ';
    else cout<<0<<' ';
    if(d&&f&&ss)cout<<1<<'\n';
    else cout<<0<<'\n';
}

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

C.

贪心+二分
贪心是把处理时长升序排序
二分的是鸡处理事情的时间点
当鸡在t时处理事情时,在t时还没有办完事情的人的不满意度都要加上tc

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

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

void solve() {
    int n,q,tc;cin>>n>>q>>tc;
    vector<int>t(n+1);
    for(int i=1;i<=n;i++)cin>>t[i];
    sort(t.begin()+1,t.end());
    vector<int>pre(n+1,0);
    for(int i=1;i<=n;i++)pre[i]=pre[i-1]+t[i];
    for(int i=1;i<=n;i++)t[i]+=pre[i-1];
    vector<int>pr(n+1,0);
    for(int i=1;i<=n;i++)pr[i]=pr[i-1]+t[i];
 //   cout<<"t[n]="<<t[n]<<'\n';
    while(q--){
        int mi=1e15;
        int m;cin>>m;
        int l=0,r=1e15,mid;
        while(l<=r){
            mid=(l+r)/2;
            if(mid>=t[n]){
                mi=min(mi,mid);
               // cout<<"mi="<<mi<<'\n';
                r=mid-1;
                continue;
            }
            int id= upper_bound(t.begin()+1,t.end(),mid)-t.begin();
            int tmp=tc*(n-id+1);
            if(tmp<=m){
                mi=min(mi,mid);
                r=mid-1;
            }else l=mid+1;
        }
        mi+=tc;
        cout<<mi<<'\n';
    }
}

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

E.

数据范围很小,3的10次方爆搜
每一轮每种结果去枚举,取最优

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

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

int n,m;
int a[15],u[15],v[15];
int ans;
void dfs(int dep){
    if(dep==m+1){
        vector<int>res(n+1);
        for(int i=1;i<=n;i++){
            res[i]=a[i];
             // cout<<a[i]<<' ';
        }
        //cout<<'\n';
        sort(res.begin()+1,res.end());
        for(int i=n;i>=1;i--){
            if(res[i]==a[1]){
                ans=min(ans,n-i+1);
                return ;
            }
        }
    }
    for(int i=1;i<=3;i++){
        if(i==1){
            a[u[dep]]+=3;
            dfs(dep+1);
            a[u[dep]]-=3;
        }else if(i==2){
            a[v[dep]]+=3;
            dfs(dep+1);
            a[v[dep]]-=3;
        }else if(i==3){
            a[u[dep]]+=1;a[v[dep]]+=1;
            dfs(dep+1);
            a[u[dep]]-=1;a[v[dep]]-=1;
        }
    }
}

void solve() {
    //dfs2(1,1);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++)cin>>u[i]>>v[i];
    ans=15;
    dfs(1);
    cout<<ans<<'\n';
}

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

G.

贪心
按原价升序排序,然后把优惠价求前缀和
只要优惠后+本钱能买得起当前原价,结果就为优惠和+本钱

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

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

void solve() {
    int n,m;cin>>n>>m;
    vector<pair<int,int>>v(n+1);
    for(int i=1;i<=n;i++){
        cin>>v[i].first>>v[i].second;
    }
    sort(v.begin()+1,v.end());
    vector<int>pre(n+1,0);
    for(int i=1;i<=n;i++){
        pre[i]=pre[i-1]+v[i].second;
    }
    int ans=m;
    for(int i=1;i<=n;i++){
        if(v[i].first-pre[i]<=m)
        ans=max(ans,v[i].first+pre[i]-v[i].first+m);
    }
    cout<<ans<<'\n';
}

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

M.

若n能被6整除,那么就是n/6个页面
若不能被整除,就有错位,那么就是n/6*2

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

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

void solve() {
    int n;cin>>n;
    if(n%6==0)cout<<n/6<<'\n';
    else cout<<2*(n/6)<<'\n';
}

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

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