牛客小白月赛7

牛客小白月赛7

github博客地址

比赛链接

A. 送分题

#include 
using namespace std;

int main()
{
    long long n;
    cin >> n;
    if(n < 20180001)
        cout << n + 2017 << endl;
    else
        cout << 20182017 << endl;
    return 0;
}

C. 谁是神射手

思路: 列出前几次概率: 1. a: a % a\% a% , b: ( 1 − a % ) ∗ b % (1 - a\%) * b\% (1a%)b% ; 2. a : ( 1 − a % ) ∗ ( 1 − b % ) ∗ a % (1 - a\%) * (1 - b\%) * a\% (1a%)(1b%)a%, b: ( 1 − a % ) 2 ∗ ( 1 − b % ) ∗ b % (1 - a\%)^2 * (1 - b\%) * b\% (1a%)2(1b%)b%

比较 两边概率大小时,不管是第几层,都会约成 a % a\% a% ? ? ? ( 1 − a % ) ∗ b % (1 - a\%) * b\% (1a%)b%

#include 
using namespace std;

int main()
{
    int a, b;
    cin >> a >> b;
    if (100 * a > (100 - a) * b)
        cout << "MWH" << endl;
    else if (100 * a < (100 - a) * b)
        cout << "CSL" << endl;
    else
        cout << "equal" << endl;
    return 0;
}

E. Applese的超能力

硬币个数 n , m 个硬币合并一次

  1. n == 1,直接 yes

  2. 如果 n != 1m == 1 永远合并不完

  3. 普通情况,先从 n 个中取出 1 枚,从 n - 1 个中取出 m - 1 枚,总共取了 m 枚。 然后把合成好的一枚硬币还回去,剩下 n - m + 1 枚,重复上面的操作,先去 1 枚,再取 m - 1 枚 …… ,可以发现,如果 n - 1 枚里 正好有整数个 m - 1 ,就可以一直和独立的那一枚合并,直到 1 枚。

#include 
using namespace std;

using ll = long long;
int main()
{
    ll n, m;
    cin >> n >> m;
    if (n == 1)
        cout << "Yes" << endl;
    else if (m == 1)
        cout << "No" << endl;
    else if ((n - 1) % (m - 1) == 0)
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
    return 0;
}

F. BFS

#include 
using namespace std;

int main()
{
    string s;
    cin >> s;
    for (auto& i : s)
        i = toupper(i);
    int item;
    if ((item = s.find("BOB")) != s.npos)
        cout << item << endl;
    else
        cout << -1 << endl;
    return 0;
}

G. CSL分苹果

无脑背包。 先算出总质量,然后除以 2 ,这就是第一个人的背包上限,然后求最优解, 总质量减去这个数,就是另一人的

#include 
using namespace std;

int main()
{
    int n;
    int a[102] = {0}, sum = 0;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        sum += a[i];
    }
    int tmp = sum;
    sum /= 2;
    int ans[10002] = {0};
    for (int i = 0; i < n; i++)
        for (int j = sum; j >= a[i]; j--)
            ans[j] = max(ans[j], ans[j - a[i]] + a[i]);
    cout << ans[sum] << ' ' << tmp - ans[sum] << endl;
    return 0;
}

I. 新建 Microsoft Office Word 文档

  1. 编号放 set

  2. 新建时,取 set 首 并从 set 中删除编号

  3. 删除时,向 set 中 插入编号,若 set.size() 增大了,说明之前没有这个号,删除成功。反之,失败

#include 
using namespace std;

int main()
{
    int n, id;
    string s;
    cin >> n;
    set<int> st;
        for (int i = 1; i <= n; i++)
            st.insert(i);
    while (n--)
    {
        cin >> s;
        if (s == "New")
        {
            cout << *st.begin() << endl;
            st.erase(st.begin());
        }
        else
        {
            cin >> id;
            int size = st.size();
            st.insert(id);
            if (st.size() == size)
                cout << "Failed" << endl;
            else
                cout << "Successful" << endl;
        }
    }
    return 0;
}

你可能感兴趣的:(比赛题解)