思路:
(1)如果14张牌里面有定缺牌,直接输出no就可以了
(2)如果没有定缺牌,就将牌存入map数组里面,当时map用的是string->int,就是记录数量
(3)最后对map进行一次遍历,记录两个的和三个的各自出现的次数,如果满足题目给出的胡牌条件,就输出yes,else输出no
(但凡当时有点脑子,开三个一维数组不就好了,或者开一个二维数组都是可以做的,开个map也是服了当时自己的脑思路了,可能当时刚学STL,感觉什么都可以用STL做)
这道题是19年11月17号新生赛中的一道题,看了看以前的代码,感觉自己那时候真的是好青涩,代码都写的粉***嫩的,从我正式接触C语言,C++,各种算法,到那时候的新生赛,应该还没有两个月,在ACM集训队中真的可以学到好多,但也会失去很多,我稍微修改了一下以前的代码,加了一点注释,记录一下当时的青涩吧,代码如下:
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <sstream> #include <map> #include <set> #include <queue> #include <stdlib.h> typedef long long ll; using namespace std; int main () { int T; char s; while(cin >> T >> s) //T为询问次数,s为定缺牌 { char a[29]; //存14张牌,每张牌占两个位置,分别表示数字(1~9)和类别(筒条万)(这里开个string不香吗,或者数组也可以开大点,非要卡这个界限~~) for (int j=1;j<=T;j++) { cin >> a; int flag=1; for (int i=0;i<=27;i++) //如果a中存在定缺牌直接输出“No” { if(a[i]==s) { flag=0; break; } } if(flag==0) { cout << "No" << endl; continue; } map<string,int>mp; //当时的惊天妙手~~(自己都不好意思了) mp.clear(); for (int i=0;i<=26;i+=2) { string a2; char bb[2]; //存牌 bb[0]=a[i]; bb[1]=a[i+1]; a2+=bb; //为了将字符转为字符串我也是费心了,其实如果前面用的string,这里用字符串的substr()函数就很简单了; mp[a2]++; } int er=0; int san=0; for (map<string,int>::iterator it=mp.begin() ; it!=mp.end() ; it++) //因为一共就那么几个变量,所以绝对不会超时,但是它会按照排好序的顺序计算的,比如2T肯定在1T的前面。 { if(it->second==2)er++; if(it->second==3)san++; } if( (er==1&&san==4) || er==7)cout << "Yes" << endl; else cout << "No" << endl; } } return 0; }