2015-05-18 20:40:13

总结:比赛中搞了两题。。。赛后 A 题被逗比地 FST 了... 

  后来发现真的是打逗比了... TAT,赛后补到 C 题。

 

A题 hdu 5228:

  题意:给出5张牌,问将其变为同花顺至少需要换多少张牌(同花顺是指花色相同,且连号,注意:10,11,12,13,1 属于连号,但 11,12,13,1,2 不是)

  思路:用 vis[][] 标记各个花色是否出现,然后用 n^2 枚举同花顺起点,每个起点开始找5张牌,记录已经出现的牌数 cnt,统计出 cnt 的最大值 cntmax,答案就是 5 - cntmax

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

#define getmid(l,r) ((l) + ((r) - (l)) / 2)
#define MP(a,b) make_pair(a,b)
#define PB(a) push_back(a)

typedef long long ll;
typedef pair<int,int> pii;
const double eps = 1e-8;
const int INF = (1 << 30) - 1;

int T;
char s[10];
int vis[4][15];

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        memset(vis,0,sizeof(vis));
        for(int i = 1; i <= 5; ++i){
            scanf("%s",s);
            int a = s[0] - 'A',b = 0;
            int len = strlen(s);
            for(int j = 1; j < len; ++j) b = b * 10 + s[j] - '0';
            vis[a][b] = 1;
        }
        int tmax = 0;
        for(int i = 0; i < 4; ++i){
            for(int j = 1; j <= 9; ++j){
                int cnt = 0;
                for(int k = j; k <= j + 4; ++k) cnt += vis[i][k];
                tmax = max(tmax,cnt);
            }
            int cnt = 0;
            for(int k = 10; k <= 13; ++k) cnt += vis[i][k];
            cnt += vis[i][1];
            tmax = max(tmax,cnt);
        }
        printf("%d\n",5 - tmax);
    }
    return 0;
}
View Code

相关文章: