题解

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

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

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

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

然后暴力搜网友的3和4

暴力搜jry的3和4

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

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

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

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

代码

  1. #include <bits/stdc++.h>
  2. #define fi first
  3. #define se second
  4. #define pii pair<int,int>
  5. #define pdi pair<db,int>
  6. #define mp make_pair
  7. #define pb push_back
  8. #define enter putchar('\n')
  9. #define space putchar(' ')
  10. #define eps 1e-8
  11. #define mo 974711
  12. #define MAXN 100005
  13. //#define ivorysi
  14. using namespace std;
  15. typedef long long int64;
  16. typedef double db;
  17. template<class T>
  18. void read(T &res) {
  19. res = 0;char c = getchar();T f = 1;
  20. while(c < '0' || c > '9') {
  21. if(c == '-') f = -1;
  22. c = getchar();
  23. }
  24. while(c >= '0' && c <= '9') {
  25. res = res * 10 + c - '0';
  26. c = getchar();
  27. }
  28. res *= f;
  29. }
  30. template<class T>
  31. void out(T x) {
  32. if(x < 0) {x = -x;putchar('-');}
  33. if(x >= 10) {
  34. out(x / 10);
  35. }
  36. putchar('0' + x % 10);
  37. }
  38. char s[20];
  39. int rem[16],A[16],W[16],K[16],ans,jry[16];
  40. int C[16],D[16],H[16],J[16],P[16];
  41. int code(char c) {
  42. if(c >= '4' && c <= '9') return c - '4' + 1;
  43. if(c == 'T') return 7;
  44. if(c == 'J') return 8;
  45. if(c == 'Q') return 9;
  46. if(c == 'K') return 10;
  47. if(c == 'A') return 11;
  48. if(c == '2') return 12;
  49. if(c == 'w') return 13;
  50. if(c == 'W') return 14;
  51. }
  52. bool check(int f,int t) {
  53. for(int i = 0 ; i <= t ; ++i) {
  54. memcpy(H,W,sizeof(H));
  55. memcpy(J,K,sizeof(K));
  56. if(2 * i + t - i + f * 2 + f * 4 + t * 3 > 17) break;
  57. int cnt = 0;
  58. for(int j = 1 ; j <= 14 ; ++j) {
  59. if(H[j] >= 2 && cnt < i) {H[j] -= 2;++cnt;}
  60. if(H[j] >= 2 && cnt < i) {H[j] -= 2;++cnt;}
  61. if(cnt == i) break;
  62. }
  63. if(cnt < i) break;
  64. cnt = 0;
  65. for(int j = 14 ; j >= 1 ; --j) {
  66. if(J[j] >= 2 && cnt < i) {J[j] -= 2;++cnt;}
  67. if(J[j] >= 2 && cnt < i) {J[j] -= 2;++cnt;}
  68. if(cnt == i) break;
  69. }
  70. if(cnt < i) break;
  71. memset(P,0,sizeof(P));
  72. cnt = 2 * f + t - i;
  73. for(int j = 14 ; j >= 1 ; --j) {
  74. int t = min(cnt,J[j]);
  75. J[j] -= t;cnt -= t;
  76. if(cnt == 0) break;
  77. }
  78. if(cnt) continue;
  79. cnt = 2 * f + t - i;
  80. for(int j = 1 ; j <= 14 ; ++j) {
  81. int t = min(cnt,H[j]);
  82. H[j] -= t;cnt -= t;
  83. if(cnt == 0) break;
  84. }
  85. if(J[14]) continue;
  86. for(int j = 1 ; j <= 14 ; ++j) {
  87. P[j] += H[j];
  88. P[j + 1] -= J[j];
  89. }
  90. cnt = 0;
  91. for(int j = 1 ; j <= 14 ; ++j) {
  92. cnt += P[j];
  93. if(cnt > 0) break;
  94. }
  95. if(cnt == 0) return true;
  96. }
  97. return false;
  98. }
  99. bool brute_jry(int dep,int four,int three,int f,int t,int q1,int q2) {
  100. if(four == f && t == three) return check(four,three);
  101. if(dep >= 12) return false;
  102. q1 += C[dep];q2 += D[dep];
  103. if(q1 > 0 || q2 > 0) return false;
  104. if(K[dep] >= 3) {
  105. K[dep] -= 3;
  106. if(brute_jry(dep + 1,four,three,f,t + 1,q1 - 1,q2)) return true;
  107. K[dep] += 3;
  108. }
  109. if(K[dep] >= 4) {
  110. K[dep] -= 4;
  111. if(brute_jry(dep + 1,four,three,f + 1,t,q1,q2 - 1)) return true;
  112. K[dep] += 4;
  113. }
  114. return brute_jry(dep + 1,four,three,f,t,q1,q2);
  115. }
  116. bool brute_wangyou(int dep,int four,int three) {
  117. if(four * 6 + three * 4 > 17) return false;
  118. if(dep > 12) {
  119. if(brute_jry(1,four,three,0,0,0,0)) return true;
  120. return false;
  121. }
  122. if(W[dep] >= 3) {
  123. W[dep] -= 3;++C[dep];
  124. if(brute_wangyou(dep + 1,four,three + 1)) return true;
  125. W[dep] += 3;--C[dep];
  126. }
  127. if(W[dep] >= 4) {
  128. W[dep] -= 4;++D[dep];
  129. if(brute_wangyou(dep + 1,four + 1,three)) return true;
  130. W[dep] += 4;--D[dep];
  131. }
  132. if(brute_wangyou(dep + 1,four,three)) return true;
  133. return false;
  134. }
  135. void dfs(int dep,int r) {
  136. if(!r) {
  137. memset(C,0,sizeof(C));
  138. memset(D,0,sizeof(D));
  139. memcpy(W,A,sizeof(A));
  140. memcpy(K,jry,sizeof(jry));
  141. if(brute_wangyou(2,0,0)) {++ans;}
  142. return;
  143. }
  144. if(dep > 14) return;
  145. for(int i = 0 ; i <= rem[dep] ; ++i) {
  146. if(i > r) break;
  147. jry[dep] = i;
  148. dfs(dep + 1,r - i);
  149. jry[dep] = 0;
  150. }
  151. }
  152. int main() {
  153. #ifdef ivorysi
  154. freopen("f1.in","r",stdin);
  155. #endif
  156. while(scanf("%s",s + 1) != EOF) {
  157. memset(A,0,sizeof(A));
  158. for(int i = 1 ; i <= 12 ; ++i) rem[i] = 4;
  159. rem[13] = rem[14] = 1;
  160. ans = 0;
  161. for(int i = 1 ; i <= 17 ; ++i) {
  162. A[code(s[i])]++;rem[code(s[i])]--;
  163. }
  164. dfs(1,17);
  165. out(ans);enter;
  166. }
  167. }

【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. oracle12c ORA-28040: No matching authentication protocol

    出错原因:11G客户端连12C数据库服务端会报这个错 解决方案一:CSDN优质解决方案,大家都说可以,然而我这边操作了不行 转自13楼:http://bbs.csdn.net/topics/39066 ...

  2. Oracle 查看正在执行的SQL语句

    SELECT A.MACHINE, username,a.SID,a.SERIAL#, sql_text,LOGON_TIME from v$session a, v$sql b where a.sq ...

  3. MT【77】函数的定义理解

    答案:D.比如C 中令$x^2+1=2,x=-1,1,$ 得$f(2)=0,2$与定义矛盾,A,B同理排除. D中注意到$x^2-2x$与$|x-1|$对称轴都是$x=1$. 评:函数的定义,首先是两 ...

  4. JAVA类变量(静态变量)

    类变量也称为静态变量,在类中以static关键字声明,但必须在方法.构造方法和语句块之外. -无论一个类创建了多少个对象,类只拥有类变量的一份拷贝. -静态变量除了被声明为常量外很少使用.常量是指声明 ...

  5. 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)

    题目描述 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 \(n\) 个游 ...

  6. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

  7. c/c++ 判断两个实型的关系

    etc. minv=1e-10 or less x>y : x>y-minv x<y : x<y+minv x=y : fabs(x-y)<minv

  8. 枚举类型---java基础代码

    package com.mon11.day4; /** * 类说明 :定义枚举 * @author 作者 : chenyanlong * @version 创建时间:2017年11月4日 */ pub ...

  9. unity常用小知识点

    感觉自己抑郁变得更严重了,超级敏感,经常想崩溃大哭,睡眠超差,实在不想药物治疗,多看看书,多约约朋友,多出去走走. 来几句鸡汤吧,人一定要活得明白一点,任何关系都不要不清不楚,说不定最后受伤的就是自个 ...

  10. python---django使用cookie和session

    在views中的调用: def login(req): message='' if req.method == "POST": user = req.POST.get(" ...