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; }