栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3051 Playing Poker

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3051 Playing Poker

#include <vector>#include <iostream>#include <algorithm>using namespace std;class Hand;class Card{        friend class Hand;    private:        int suit, rank;    public:        friend bool operator<(const Card& lhs, const Card& rhs)        { return lhs.rank < rhs.rank;        }        friend istream& operator>>(istream& is, Card& c)        { char ch; is >> ch; switch(ch) {     case 'H': c.suit = 0; break;     case 'S': c.suit = 1; break;     case 'D': c.suit = 2; break;     case 'C': c.suit = 3; break;     default: throw "INVAILD_SUIT"; } is >> ch; switch(ch) {     case 'T': c.rank = 10; break;     case 'J': c.rank = 11; break;     case 'Q': c.rank = 12; break;     case 'K': c.rank = 13; break;     case 'A': c.rank = 14; break;     default:         if (!(ch >= '2' && ch <= '9')) {  throw "INVALID_RANK";         }         c.rank = ch - '0'; break; } return is;        }};class Hand{    private:        vector<Card> vc;        bool isflush()        { for (size_t i = 1; i < 5; i++) {     if (vc[i].suit != vc[0].suit) {         return false;     } } return true;        }        bool isstraihgt()        { for (size_t i = 1; i < 5; i++) {     if (vc[i].rank != vc[0].rank + i) {         return false;     } } return true;        }        bool has_4()        { return vc[0].rank == vc[3].rank || vc[1].rank == vc[4].rank;        }        bool has_3_2()        { return vc[0].rank == vc[2].rank && vc[3].rank == vc[4].rank ||     vc[0].rank == vc[1].rank && vc[2].rank == vc[4].rank;        }        bool has_3()        { for (int i = 2; i < 5; i++) {     if (vc[i - 2].rank == vc[i].rank) {         return true;     } } return false;        }        int cnt_2()        { int ret = 0; for (int i = 1; i < 5; i++) {     if (vc[i].rank == vc[i - 1].rank) {         ++ret;     } } return ret;        }    public:        void add(const Card& c)        { vc.push_back(c);        }        int rate()        { if (vc.size() != 5) {     throw "INVALID_HAND"; } sort(vc.begin(), vc.end()); bool flush = isflush(), straihgt = isstraihgt(); if (flush && straihgt) {     return (vc[4].rank == 14) ? 500 : 100; } else if (has_4()) {     return 50; } else if (has_3_2()) {     return 15; } else if (flush) {     return 10; } else if (straihgt) {     return 8; } else if (has_3()) {     return 4; } else {     switch (cnt_2()) {         case 2: return 3;         case 1: return 2;         case 0: return 0;         default: throw "INVAILD_CNT_2";     } }        }};int rate(const vector<Card>& vc){    int ret = 0;    vector<bool> p(5, false);    for (size_t i = vc.size() - 5; i < 5; i++) {        p[i] = true;    }    do {        Hand h;        for (size_t i = 0; i < 5; i++) { if (p[i]) {     h.add(vc[i]); }        }        for (size_t i = 5; i < vc.size(); i++) { h.add(vc[i]);        }        ret = max(ret, h.rate());    } while (next_permutation(p.begin(), p.end()));    return ret;}int main(void){    int n;    while (cin >> n) {        vector<Card> vc(n);        for (int i = 0; i < n; i++) { cin >> vc[i];        }        vector<int> dp(n + 1, 0);        dp[0] = 1;        for (int i = 5; i <= n; i++) { for (int j = max(0, i - 10); j <= i - 5; j++) {     dp[i] = max(dp[i], min(9999, dp[j] * rate(vector<Card>(vc.begin() + j, vc.begin() + i)))); }        }        int ans = *max_element(dp.begin() + 5, dp.end());        cout << 16 + ((ans == 0) ? -1 : (10 * (ans - 1))) << endl;    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/367154.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号