牛客小白月赛90

A.小A的文化节

思路

没思路,签到题,一个可以优化内存的点是项目可以不开数组,只用一个变量就行

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define ll long long
    #define pb push_back
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    int n,m;
    int a[N];


    void solve(){
        cin>>n>>m;
        for(int i=1;i<=n;i++)cin>>a[i];
        int ans=0;
        int ele;
        for(int i=1;i<=m;i++){
            cin>>ele;
            ans+=a[ele];
        }
        cout<<ans<<endl;
        return ;
    }

    int main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

B.小A的游戏

思路

假设 \(a,b,c\) 分别是A胜,打平和B胜的场次,则A的得分:\(3a+b\) ; B的得分:\(3c+b\) ,两式相减得 : \(3(a-c)\) ,这个式子一定要是3的倍数才行,一个判断就行;

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define ll long long
    #define pb push_back
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    int a,b;

    void solve(){
        cin>>a>>b;
        if((a-b)%3==0)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
        return ;
    }

    int main()
    {
        fast();
        
        int t=1;
        cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

C.小A的数字

思路

构造:每次使用尽量小的数字就行,我优先使用0和1构造,能选0选0,不能就选1,再最后删去所有前导零,这种思路需要一个特判:当答案全是0的时候,证明原数字不包含0,此时看最后一位,是1输出2,不是1输出1即可

代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define ll long long
    #define pb push_back
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    string s;

    void solve(){
        cin>>s;
        int n=s.size();
        string ans="";
        for(int i=n-1;i>=0;i--){
            if(s[i]=='0')ans="1"+ans;
            else ans="0"+ans;
        }
        int start=0;
        for(int i=0;i<n;i++){
            if(ans[i]=='0')start++;
            else break;
        }
        ans=ans.substr(start,n-start);
        if(ans==""){
            if(s[n-1]=='1')cout<<2<<endl;
            else cout<<1<<endl;
            return ;
        }
        else cout<<ans<<endl;
    }

    int main()
    {
        fast();
        
        int t=1;
        cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

D.小A的线段(easy version)

思路

m的数据上界只有10,DFS爆搜即可,枚举每个线段用和不用(连状态数组都不用开)

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define ll long long
    #define pb push_back
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    const int N = 2e6+10, MAX = 1e9, INF = -1e9;
    ll mod = 998244353 ;

    int n,m;
    vector<PII> v(15);
    ll ans=0;
    vector<int> a(N,0);
    void dfs(int x){
        if(x>m){
            bool flag=true;
            for(int i=1;i<=n;i++){
                if(a[i]<2)flag=false;
                //break;
            }
            if(flag)ans++;
            return ;
        }
        //选
        int left=v[x].first;int right=v[x].second;
        for(int i=left;i<=right;i++)a[i]++;
        dfs(x+1);
        
        //不选
        for(int i=left;i<=right;i++)a[i]--;
        dfs(x+1);
    }

    void solve(){
        cin>>n>>m;
        int l,r;
        for(int i=1;i<=m;i++){
            cin>>l>>r;
            v[i]={l,r};
        }
        dfs(1);
        cout<<ans<<endl;
        return ;
    }

    int main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

E.小A的任务

思路

m的上界是100,比较小,每次询问枚举最后一个B问题,用优先队列维护最小值即可(直接暴力好像就行,唉)

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define ll long long
    #define pb push_back
    #define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
    using namespace std;

    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    ll a[N],b[N],c[N],k,n,m; 
    priority_queue<ll>p;

    void solve(){
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            cin>>a[i],a[i]+=a[i-1];
        for(int i=1;i<=n;i++)
            cin>>b[i],c[i]=b[i],b[i]+=b[i-1];
        while(m--){
            cin>>k;
            ll f=upper_bound(a+1,a+1+n,a[k]+b[k])-a-1;
            ll ans=a[k]+b[k],t=0;
            while(!p.empty())p.pop();
            for(int i=1;i<=k;i++)p.push(c[i]);
            for(int i=k+1;i<=f;i++){
                int x=p.top()-c[i];
                if(x>0)p.pop(),p.push(c[i]),t+=x;
                ans=min(ans,a[i]+b[k]-t);
            }
            cout<<ans<<endl;
        }
        return ;
    }

    int main()
    {
        fast();
        
        int t=1;
        //cin>>t;
        while(t--){
            solve();
        }
        return 0;
    }

t.b.c

posted @ 2024-04-05 22:22  Oaths  阅读(49)  评论(0)    收藏  举报