题解

什么,我这题竟然快到了LOJ rk1????

搜起来有点麻烦,不过感觉还是比斗地主好下手(至今没敢写斗地主

首先是暴力搜牌型,最多\(3^{16}\)(什么判解还要复杂度怂成一团)的样子??

然后判牌型,显然只要考虑单牌,和3 + x,4+2

然后暴力搜网友的3和4

暴力搜jry的3和4

然后枚举3搭配了几个2,

然后jry从大到小开始去除大小为2的对子,网友从小到大,是个简单的贪心

之后看看可以去掉的单牌的个数,也是jry从大到小,网友从小到大

之后的就是单牌互相压看看合不合法就好了

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
char s[20];
int rem[16],A[16],W[16],K[16],ans,jry[16];
int C[16],D[16],H[16],J[16],P[16];
int code(char c) {
if(c >= '4' && c <= '9') return c - '4' + 1;
if(c == 'T') return 7;
if(c == 'J') return 8;
if(c == 'Q') return 9;
if(c == 'K') return 10;
if(c == 'A') return 11;
if(c == '2') return 12;
if(c == 'w') return 13;
if(c == 'W') return 14;
}
bool check(int f,int t) {
for(int i = 0 ; i <= t ; ++i) {
memcpy(H,W,sizeof(H));
memcpy(J,K,sizeof(K));
if(2 * i + t - i + f * 2 + f * 4 + t * 3 > 17) break;
int cnt = 0;
for(int j = 1 ; j <= 14 ; ++j) {
if(H[j] >= 2 && cnt < i) {H[j] -= 2;++cnt;}
if(H[j] >= 2 && cnt < i) {H[j] -= 2;++cnt;}
if(cnt == i) break;
}
if(cnt < i) break;
cnt = 0;
for(int j = 14 ; j >= 1 ; --j) {
if(J[j] >= 2 && cnt < i) {J[j] -= 2;++cnt;}
if(J[j] >= 2 && cnt < i) {J[j] -= 2;++cnt;}
if(cnt == i) break;
}
if(cnt < i) break;
memset(P,0,sizeof(P));
cnt = 2 * f + t - i;
for(int j = 14 ; j >= 1 ; --j) {
int t = min(cnt,J[j]);
J[j] -= t;cnt -= t;
if(cnt == 0) break;
}
if(cnt) continue;
cnt = 2 * f + t - i;
for(int j = 1 ; j <= 14 ; ++j) {
int t = min(cnt,H[j]);
H[j] -= t;cnt -= t;
if(cnt == 0) break;
}
if(J[14]) continue;
for(int j = 1 ; j <= 14 ; ++j) {
P[j] += H[j];
P[j + 1] -= J[j];
}
cnt = 0;
for(int j = 1 ; j <= 14 ; ++j) {
cnt += P[j];
if(cnt > 0) break;
}
if(cnt == 0) return true;
}
return false;
}
bool brute_jry(int dep,int four,int three,int f,int t,int q1,int q2) {
if(four == f && t == three) return check(four,three);
if(dep >= 12) return false;
q1 += C[dep];q2 += D[dep];
if(q1 > 0 || q2 > 0) return false;
if(K[dep] >= 3) {
K[dep] -= 3;
if(brute_jry(dep + 1,four,three,f,t + 1,q1 - 1,q2)) return true;
K[dep] += 3;
}
if(K[dep] >= 4) {
K[dep] -= 4;
if(brute_jry(dep + 1,four,three,f + 1,t,q1,q2 - 1)) return true;
K[dep] += 4;
}
return brute_jry(dep + 1,four,three,f,t,q1,q2);
}
bool brute_wangyou(int dep,int four,int three) {
if(four * 6 + three * 4 > 17) return false;
if(dep > 12) {
if(brute_jry(1,four,three,0,0,0,0)) return true;
return false;
}
if(W[dep] >= 3) {
W[dep] -= 3;++C[dep];
if(brute_wangyou(dep + 1,four,three + 1)) return true;
W[dep] += 3;--C[dep];
}
if(W[dep] >= 4) {
W[dep] -= 4;++D[dep];
if(brute_wangyou(dep + 1,four + 1,three)) return true;
W[dep] += 4;--D[dep];
}
if(brute_wangyou(dep + 1,four,three)) return true;
return false;
}
void dfs(int dep,int r) {
if(!r) {
memset(C,0,sizeof(C));
memset(D,0,sizeof(D));
memcpy(W,A,sizeof(A));
memcpy(K,jry,sizeof(jry));
if(brute_wangyou(2,0,0)) {++ans;}
return;
}
if(dep > 14) return;
for(int i = 0 ; i <= rem[dep] ; ++i) {
if(i > r) break;
jry[dep] = i;
dfs(dep + 1,r - i);
jry[dep] = 0;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
while(scanf("%s",s + 1) != EOF) {
memset(A,0,sizeof(A));
for(int i = 1 ; i <= 12 ; ++i) rem[i] = 4;
rem[13] = rem[14] = 1;
ans = 0;
for(int i = 1 ; i <= 17 ; ++i) {
A[code(s[i])]++;rem[code(s[i])]--;
}
dfs(1,17);
out(ans);enter;
}
}

【LOJ】#6434. 「PKUSC2018」主斗地的更多相关文章

  1. Loj#6434「PKUSC2018」主斗地(搜索)

    题面 Loj 题解 细节比较多的搜索题. 首先现将牌型暴力枚举出来,大概是\(3^{16}\)吧. 然后再看能打什么,简化后无非就三种决策:单牌,\(3+x\)和\(4+x\). 枚举网友打了几张\( ...

  2. 「PKUSC2018」主斗地(暴搜)

    这道斗地主比 \(PKUWC\) 那道可做多了... 我们用 \(NOIP\) 那道斗地主的思路:暴搜出三代和四代,贪心出散牌. 还有jry为什么要出xx网友而不出他的另一个老婆 我们发现两个人的每回 ...

  3. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  4. LOJ #6435. 「PKUSC2018」星际穿越(倍增)

    题面 LOJ#6435. 「PKUSC2018」星际穿越 题解 参考了 这位大佬的博客 这道题好恶心啊qwq~~ 首先一定要认真阅读题目 !! 注意 \(l_i<r_i<x_i\) 这个条 ...

  5. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

  6. Loj#6433「PKUSC2018」最大前缀和(状态压缩DP)

    题面 Loj 题解 先转化题意,其实这题在乘了\(n!\)以后就变成了全排列中的最大前缀和的和(有点拗口).\(n\leq20\),考虑状压\(DP\) 考虑一个最大前缀和\(\sum\limits_ ...

  7. Loj#6432「PKUSC2018」真实排名(二分查找+组合数)

    题面 Loj 题解 普通的暴力是直接枚举改或者不改,最后在判断最后对哪些点有贡献. 而这种方法是很难优化的.所以考虑在排序之后线性处理.首先先假设没有重复的元素 struct Node { int p ...

  8. Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)

    题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...

  9. Loj 6432. 「PKUSC2018」真实排名 (组合数)

    题面 Loj 题解 枚举每一个点 分两种情况 翻倍or不翻倍 \(1.\)如果这个点\(i\)翻倍, 要保持排名不变,哪些必须翻倍,哪些可以翻倍? 必须翻倍: \(a[i] \leq a[x] < ...

随机推荐

  1. Spoj 8372 Triple Sums

    题意:给你n个数字,对于任意s,s满足\(s=u_i+u_j+u_k,i<j<k\),要求出所有的s和对应满足条件的i,j,k的方案数 Solution: 构造一个函数:\(A(x)=\s ...

  2. 【刷题】BZOJ 2287 【POJ Challenge】消失之物

    Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. "要使用剩下的 N - 1 物品装满容积为 x ...

  3. 【刷题】LOJ 6008 「网络流 24 题」餐巾计划

    题目描述 一个餐厅在相继的 \(n\) 天里,每天需用的餐巾数不尽相同.假设第 \(i\) 天需要 \(r_i\) 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 \(P\) 分:或者把旧餐巾送到快洗 ...

  4. Spring点滴十:Spring自动装配(Autowire)

    在基于XML配置元数据,在bean的配置信息中我们可以使用<constructor-arg/>和<property/>属性来实现Spring的依赖注入.Spring 容器也可以 ...

  5. 【转】树莓派Raspberry Pi - 还原已经装过系统的TF卡

    想给树莓派换个系统的话,需要先把已经装过系统的TF卡进行还原,这里使用最简单粗暴无脑的方法: 1,下载安装Win32 Disk Imager(一般已经装过一次系统后,这个东西都有) 2,下载boots ...

  6. Oracle和SQL SERVER在SQL语句上的差别

    Oracle与Sql server都遵循SQL-92标准:http://owen.sj.ca.us/rkowen/howto/sql92F.html,但是也有一些不同之处,差别如下: Oracle中表 ...

  7. Python基础学习(三)

    了解了Python的基础使用,接下来继续练手廖雪峰老师的教学案例. 一.变量可以指向函数 说明,一个函数可以赋值给一个变量,该变量就会具有该函数的功能,举例: gg = abs print( gg(- ...

  8. pat1001. Battle Over Cities - Hard Version 解题报告

    /**题目:删去一个点,然后求出需要增加最小代价的边集合生成连通图思路:prim+最小堆1.之前图中未破坏的边必用,从而把两两之间可互达的点集合 合并成一个点2.求出不同点集合的最短距离,用prim+ ...

  9. 以Java的视角来聊聊BIO、NIO与AIO的区别?

    转: 以Java的视角来聊聊BIO.NIO与AIO的区别? 飞丫玲丫 17-07-2623:10 题目:说一下BIO/AIO/NIO 有什么区别?及异步模式的用途和意义? BIO(Blocking I ...

  10. hive安装笔记

    http://note.youdao.com/noteshare?id=bfbe59aef4ef7c3502975d3d575239e1