牛客小白月赛补题65

A .牛牛去购物

这道题目纯纯数学题,一遍一遍更新最小值,我们每一次都用a * i + b * j,计算出最小的答案

ACcode

#include <bits/stdc++.h>
#define int long long 
const int N = 1000010;


int a[N];
using namespace std;
signed main()
{
    int n , a , b;
    cin >> n >> a >> b;
    int min1 = 0x3f3f3f3f;
    
    for(int i = 0 ; i * a <= n ; i ++ )
    {
        for(int j = 0 ; j * b <= n ; j ++ )
        {
            if(i * a + j * b <= n)
            {
                min1 = min(min1 , n - i * a - j * b);
            }
        }
    }
    cout << min1;
    return 0;
    
}

B .牛牛写情书

这道题目就是一个find函数,然后就可以写出来

ACcode

#include <bits/stdc++.h>
#define int long long 
const int N = 1000010;


int a[N];
using namespace std;
signed main()
{
    int n , m ;
    cin >> n >> m;
    string s;
    cin >> s;
    string s1;
    
    for(int i = 0 ; i < s.size() ; i ++ )
    {
        if(s[i] >= 'a' && s[i] <= 'z')
        {
            s1 += s[i];
            
        }
    }
    string s2;
    cin >> s2;
    
    if(s1.find(s2) != -1)
    {
        cout << "YES" ;
    }
    else
    {
        cout << "NO" ;
    }
    return 0;
    
}

C .牛牛排队伍

这道题目我直接用set存储,然后使用一个find就可以,但是在输出答案时我们输出的是指针变量,然后就是这道题时间会卡输入输出,所以就要用题目给出方法输入输出

ACcode

#include <bits/stdc++.h>
#define int long long 
const int N = 1000010;


int a[N];
using namespace std;
signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int n , k;
    cin >> n >> k;
    set<int> s;
    for(int i = 0 ; i <= n ; i ++ )
    {
        s.insert(i);
        
    }
    while(k -- )
    {
        int op , q;
        cin >> op >> q;
        if(op == 1)
        {
            s.erase(q);
        }
        else
        {
            auto u = s.find(q);
            cout << *(-- u) << "\n";
            
        }
    }
    return 0;
    
}

D .牛牛取石子

一道博弈论 有分析可以知道有如下结论

ACcode

#include <bits/stdc++.h>
#define int long long 
const int N = 1000010;


int a[N];
using namespace std;
signed main()
{
    int t;
    cin >> t;
    while(t -- )
    {
        int a , b;
        cin >> a >> b;
        if(min(a , b) % 3 == 0 || (a == b && a % 3 == 1))
        {
            cout << "niumei" << "\n";
            
        }
        else
        {
            cout << "niuniu" << "\n";
            
        }
    }
    return 0;
    
}

 E .牛牛的构造

这道题目是一个非常好的题目,但是思路有一些复杂,所以我就直接上代码了这是个前缀和的题目(这道题目会卡常,不要用 #define int long long)

ACcode

#include <bits/stdc++.h>

const int N = 1000010;


int a[N];
int b[N];

using namespace std;
int main()
{
    int n , k;
    cin >> n >> k;
    for(int i = 1 ; i <= N ; i *= 2 )
    {
        a[i + 1] = 1;
        
    }
    for(int i = 1 ; i <= N ; i ++ )
    {
        a[i] = a[i] + a[i - 1];
        
    }
    for(int i = 1 ; i <= N ; i ++ )
    {
        b[i] = b[i - 1] + a[i];
    }
    if(b[n] < k)
    {
        cout << "-1";
        return 0;
        
    }
    vector<int> l , r;
    for(int i = n ; i >= 1 ; i -- )
    {
        if(k >= a[i])
        {
            l.push_back(i);
            k -= a[i];
            
        }
        else
        {
            r.push_back(i);
        }
    }
    reverse(r.begin() , r.end());
    for(auto u : l)
    {
        cout << u << " ";
    }
    for(auto u : r)
    {
        cout << u << " ";
        
    }
    return 0;
}

 

posted @ 2023-01-07 11:01  AK梦  阅读(58)  评论(0)    收藏  举报