《看了受制了》第三天,6道题,合计16道题

2023年8月28日 受制了系列第三天

今天是牛客和ACWING的题

AcWing5135 奶牛用餐

题目理解

这个题目是,考察了优先队列的知识。我们可以用STL的priority_queue快速实现。然后输出的时间就是作比较。。。balabala

代码实现

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

const int N = 5e5 + 10;

priority_queue<long long, vector<long long>, greater<long long>> q;

int n, k;
long long res[N];

int main()
{
    cin >> n >> k;

    long long now = 0;

    for (int i = 0; i < k; i ++ ) q.push(0);

    for(int i = 1; i <= n; i++)
    {
        long long s, t;
        cin >> s >> t;

        auto time = q.top();
        q.pop();

        long long end = max(s, time) + t;
        q.push(end);

        cout << end << endl;
    }

    return 0;
}

AcWing5132 奶牛照相

题目理解

该题目是个模拟的题目,我们需要找到最高的,和除了最高的那个以外最高的,找到这两个就可以了。

代码实现

#include<iostream>
using namespace std;

const int N = 2e5 + 10;
typedef long long ll;

int w[N], h[N], wh[N];
int n;

int main()
{
    cin >> n;

    int pw = 0; 
    int maxh = 0, semaxh = 0;
    int flag_max = 0;
    for(int i = 1; i <= n; i++)
    {
        cin >> w[i] >> h[i];
        pw += w[i];

        // 找到最高的
        if(h[i] > maxh)
        {
            maxh = h[i];
            flag_max = i;
        }
    }

    // 找到除它意外最大的
    for(int i = 1; i <= n; i++)
        if(flag_max != i)
            semaxh = max(semaxh, h[i]);

    // 为了方便规范一下高度数组
    for(int i = 1; i <= n; i++)
        if(i != flag_max)
            wh[i] = maxh;
        else
            wh[i] = semaxh;

    // 输出答案
    for(int i = 1; i <= n; i++)
    {
        if(i != flag_max)
            cout << (pw - w[i]) * wh[i] << " ";
        else
            cout << (pw - w[i]) * wh[i] << " ";
    }

    return 0;
}

牛客小白月赛76期 猜拳游戏

题目理解

就是推导出来它给啥输出啥就行。

代码实现

#include<iostream>
using namespace std;

int main()
{
    
    string a;
    cin >> a;
    
    cout << a;
    return 0;
}

牛客小白月赛76期 Kevin喜欢一

题目理解

就求出2的k次方大于等于n, 输出k即可。

代码实现

#include<iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    
    for(int i = 1; i <= n; i++)
    {
        int res = 0;
        long long k;
        cin >> k;
        
        long long q = 1;
        while(q < k)
            q *= 2, res++;
        
        cout << res << endl;
    }
    
    return 0;
}

牛客小白月赛76期 A加B,A模B

题目理解

这个题从数学的逻辑上来推道,这个a和b肯定是1~n之间的数,那么又因为a % b == m那么这个m一定会小于等于n / 2。那么这样的话,就会得到a和b为mn - m,如果 m >= n / 2则无解。这个时候我们便可得出答案了。

题目坑

我们不能写m >= n / 2有精度的问题,我们要写 m * 2 >= n

代码实现

#include<iostream> 
#include<cstdio>
using namespace std;

int main()
{
    int T;
    cin >> T;
    
    while(T -- )
    {
        long long n, m;
        scanf("%lld%lld", &n, &m);
        
        if(m * 2 >= n )
        {
            cout << -1 << endl;
        }else
            cout << m << " " << n - m << endl;
    }
    
    return 0;
}

牛客小白月赛76期 MoonLight的运算问题

题目理解

只要x <= 1或者ai <= 1就加,不然就乘。但是要注意取模的时候。

代码实现

#include<iostream>
using namespace std;

using namespace std;
const int mod=998244353;
const int N=1e6+5,M=5e3+5;

typedef long long ll;

int main()
{
    ll t;
    t=1;
    cin>>t;
    while(t--)
    {
        ll n;
        cin>>n;
        ll x=0;

        ll flag=0;
        for(ll i=1;i<=n;i++)
        {
            ll tmp;
            cin >> tmp;
            if(x>=mod)flag=1,x%=mod;
            if(flag==0)
            {
                if(x <= 1 || tmp <= 1)x=x+tmp;
                else x=x*tmp;
            }
            else
            {
                if(tmp==1||tmp==0)x=(x+tmp)%mod;
                else x=(x*tmp)%mod;
            }
        }
        if(x>=mod)x%=mod;
        cout<<x<<endl;
    }
    return 0;
}
posted @ 2023-08-31 13:35  wxzcch  阅读(15)  评论(0)    收藏  举报