题解 | #打牌#
打牌
https://www.nowcoder.com/practice/82442ee76977479e8ab4b88dfadfca9f
#include <iostream> #include <valarray> #include <queue> #include <cstring> #include <stack> using namespace std; bool getBigger(int a, string &cards) { // 找出第一张比a大的牌 for (unsigned int i = 0; i < cards.size(); ++i) { if (a < cards[i] - '0') { cards[i] = 0; return true; } } return false; } bool getBiggerNew(int a, int &get, string &cards) { // 找出第一张比a大1的牌 for (unsigned int i = 0; i < cards.size(); ++i) { if (a < cards[i] - '0') { get = cards[i] - '0'; cards[i] = 0; return true; } } return false; } void getEachNum(int fre[], string cards) { // 计算每种牌出现的频率 for (unsigned int i = 0; i < cards.size(); ++i) { fre[cards[i] - '0']++; } // for (int i = 0; i < 10; ++i) { // printf("fre[%d]=%d\n",i,fre[i]); // } } bool get_win(string card, string against) { int len = against.size(); int fre[10]; //每种牌出现的频率 for (int i = 0; i < 10; ++i) { fre[i] = 0; } getEachNum(fre, card); if (len == 1) { int now = against[0] - '0'; if (getBigger(now, card)) { return true; } return false; } else if (len >= 2 && len <= 4) { for (int i = against[0] - '0'; i < 9; ++i) { if (fre[i + 1] >= len) { // 找到一个牌号可以 // now = i + 1; return true; } } return false; } else { int now = against[0] - '0'; int get, last; if (!getBiggerNew(now, last, card)) { return false; } for (int i = 1; i < 5; ++i) { now = against[i] - '0'; if (getBiggerNew(last, get, card)) { if (get == last + 1) { last = get; continue; } return false; } return true; } } return true; } int main() { string cards, against; cin >> cards >> against; if (get_win(cards, against)) { cout << "YES"; } else { cout << "NO"; } }