11.22A 御阪美琴-優先佇列模擬
阿新 • • 發佈:2018-11-26
連結: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; }