思路:
(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;
}



京公网安备 11010502036488号