• SOJ 1018. A Card Trick


    题目大意:一张卡牌由value和suit决定。value的范围(从小到大)是A,2,3,4,5,6,7,8,9,10,J,Q,K。suit的范围(从小到大)是C,D,H,S。

           两张牌比较大小:value较小的牌较小,若value值相等,suit较小的牌较小。

         给出五张牌,要求对五张牌进行排列,以满足某种要求:第一张牌和第二张牌的suit要求相同,从后三张牌中选择最小的牌,获得它的位置pos_min(1,2或3),后三张牌除去最小的牌剩余的两张牌如果不是从小到大有序的则addition = 3,否则addition = 0. 第二张牌的value + pos_min + addition(若大于13则三者和减13)等于第一张牌的value。

    解题思路:模拟。结构化牌,包括value和suit两个元素。对五张牌进行全排列,对每一个排列检查是否满足要求,找到第一个满足要求的排列即可。

    代码如下:

      1 #include <cstdio>
      2 #include <cstdlib>
      3 #include <iostream>
      4 #include <string>
      5 #include <algorithm>
      6 using namespace std;
      7 
      8 class Card {
      9 public:
     10     friend istream & operator>>(istream &is, Card &card) {
     11         string text;
     12         is >> text;
     13         // for (int i = 0; i < text.size(); ++i) text[i] = toupper(text[i]);
     14         card.value = atoi(text.c_str());
     15         // 获取value
     16         if (card.value == 0) {    // 没有数字开头
     17             if (text[0] == 'J') {
     18                 card.value = 11;
     19             } else if (text[0] == 'Q') {
     20                 card.value = 12;
     21             } else if (text[0] == 'K') {
     22                 card.value = 13;
     23             } else if (text[0] == 'A') {
     24                 card.value = 1;
     25             } else {
     26                 while (true);
     27             }
     28         }
     29         // 获取suit
     30         /*if (text.back() == 'C') {
     31             card.suit = 1;
     32         } else if (text.back() == 'D') {
     33             card.suit = 2;
     34         } else if (text.back() == 'H') {
     35             card.suit = 3;
     36         } else if (text.back() == 'S') {
     37             card.suit = 4;
     38         }*/
     39         if (text[text.size()-1] == 'C') {
     40             card.suit = 1;
     41         } else if (text[text.size()-1] == 'D') {
     42             card.suit = 2;
     43         } else if (text[text.size()-1] == 'H') {
     44             card.suit = 3;
     45         } else if (text[text.size() - 1] == 'S') {
     46             card.suit = 4;
     47         } else {
     48             while (true);
     49         }
     50         return is;
     51     }
     52 
     53     friend ostream & operator<<(ostream &os, const Card &card) {
     54         if (card.value == 1) os << "A";
     55         else if (card.value < 11) os << card.value;
     56         else if (card.value == 11) os << "J";
     57         else if (card.value == 12) os << "Q";
     58         else if (card.value == 13) os << "K";
     59         if (card.suit == 1) os << "C";
     60         else if (card.suit == 2) os << "D";
     61         else if (card.suit == 3) os << "H";
     62         else if (card.suit == 4) os << "S";
     63         return os;
     64     }
     65 
     66     bool operator<(const Card &other) const {
     67         return (value < other.value) || (value == other.value && suit < other.suit);
     68     }
     69     int value;
     70     int suit;
     71 };
     72 
     73 int main() {
     74     int times;
     75     const int maxn = 5;
     76     Card cards[maxn];
     77     scanf("%d", &times);
     78     for (int t = 1; t <= times; ++t) {
     79         for (int i = 0; i < maxn; ++i) cin >> cards[i];
     80         sort(cards, cards + maxn);
     81         do {
     82             if (cards[0].suit != cards[1].suit) continue;
     83             int addition;
     84             if (cards[2] < cards[3] && cards[2] < cards[4]) {    // cards[2] 最小
     85                 addition = 1;
     86                 addition += cards[3] < cards[4] ? 0 : 3;
     87             } else if (cards[3] < cards[2] && cards[3] < cards[4]) {    // cards[3] 最小
     88                 addition = 2;
     89                 addition += cards[2] < cards[4] ? 0 : 3;
     90             } else if (cards[4] < cards[2] && cards[4] < cards[2]) {
     91                 addition = 3;
     92                 addition += cards[2] < cards[3] ? 0 : 3;
     93             }
     94             if (cards[0].value == (cards[1].value + addition - 1) % 13 + 1) break;
     95         } while (next_permutation(cards, cards + maxn));
     96         cout << "Problem " << t << ": ";
     97         for (int i = 0; i < maxn; ++i) {
     98             cout << cards[i] << (i + 1 == maxn ? "
    " : " ");
     99         }
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    sell02 展现层编写
    sell01 环境搭建、编写持久层并进行测试
    SpringBoot04 日志框架之Logback
    SpringBoot04 项目热部署详解
    SpringBoot03 项目热部署
    Angular14 利用Angular2实现文件上传的前端、利用springBoot实现文件上传的后台、跨域问题
    Flask17 Flask_Script插件的使用
    Angular13 Angular2发送PUT请求在后台接收不到参数
    PostMan安装
    unix网络编程环境配置程序运行
  • 原文地址:https://www.cnblogs.com/mchcylh/p/4972783.html
Copyright © 2020-2023  润新知