1. 程式人生 > >11.22A 御阪美琴-優先佇列模擬

11.22A 御阪美琴-優先佇列模擬

連結:https://ac.nowcoder.com/acm/contest/271/A
來源:牛客網
 

題目描述

misaka是呱太爺爺的小粉絲,呱太爺爺有一句話說的好:"一尺之棰,日取其半,萬世不竭"。

misaka現在有 n 個呱太玩偶放在一堆,每一次操作,misaka會選擇當前個數 > 1 的一堆呱太玩偶。並將這一堆呱太玩偶分成 兩堆,x 是當前這一堆玩偶的個數。現在 misaka 想將玩偶分成 m 堆,其中第 i 堆呱太玩偶的個數是 ai ,你需要告訴 misaka 是否能通過若干次操作將玩偶分成指定的這 m 堆。如果可以輸出 ,否則輸出

輸入描述:

第一行兩個數 n, m 。
接下來一行 m 個數 ai 。

輸出描述:

輸出共一個字串 ,表示 misaka 能否將玩偶分成指定的 m 堆。

示例1

輸入

複製

4 1
5

輸出

複製

ham

備註:

1 ≤ n ≤ 1018, 1 ≤ m ≤ 105, 1 ≤ ai ≤ 1018。

思路:這個的話,就是一道模擬吧,模擬的思路也挺好理解的,就是當時想思路的時候遲遲沒有思路。。。詳情見程式碼吧

程式碼:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll n, m;
    cin >> n >> m;
    priority_queue<ll>q1, q2;
    q1.push(n);
    ll a,b;
    for (int i = 0; i < m; i++)
    {
        scanf("%lld", &a);
        q2.push(a);
    }
    int flag = 1;
    while (!q2.empty())
    {
        a = q1.top();
        b = q2.top();
        if(q1.size()>q2.size())
        {
            flag=0;
            break;
        }
        if (a == b)
        {
            q1.pop();
            q2.pop();
            continue;
        }
        else if (a < b)
        {
            flag = 0;
            break;
        }
        else
        {
            q1.pop();
            q1.push(a / 2);
            q1.push(a - a / 2);
        }
    }
    flag = flag && q1.empty() && q2.empty();
    if (flag)
        cout << "misaka" << endl;
    else
        cout << "ham" << endl;

}