斗地主

最后还是去看了题解,也算把坑填了吧。感觉大概是懂了,写一下思路。主要是因为还是老感觉哪里别扭想找个地方说出来

先放上代码

 1 #include<bits/stdc++.h>//如果不出顺子,那么我们出完牌所需的步数是一定的
 2 using namespace std;//我们将每种牌按其的个数分为若干组,每一组都可以自己单独打出,那么我么需要尽可能合并这些组(4+2,3+1……)
 3 //通常是不拆牌的,4个的3个的拆了肯定不会更优(无顺子),但有一种情况特殊,一炸弹一对一单,这种情况下需要拆开对
 4 int T,n,num[24],cnt[20],mi,ans[5];
 5 int get(){
 6     memset(ans,0,sizeof(ans));int tem=0;
 7     for(int i=3;i<=16;i++)ans[cnt[i]]++;
 8     while(ans[4]>=1&&ans[2]>=2)ans[4]--,ans[2]-=2,tem++;
 9     while(ans[4]>=1&&ans[1]>=2)ans[4]--,ans[1]-=2,tem++;
10     if(ans[4]>=1&&ans[2]==1&&ans[1]==1)ans[4]--,ans[2]--,tem++;
11     while(ans[3]>=1&&ans[2]>=1)ans[3]--,ans[2]--,tem++;
12     while(ans[3]>=1&&ans[1]>=1)ans[3]--,ans[1]--,tem++;
13     return tem+ans[1]+ans[2]+ans[3]+ans[4];
14 }
15 void dfs(int x){
16     mi=min(mi,get()+x);
17     for(int i=3;i<=13;i++){
18         int j=i;while(cnt[j]>=3&&j<=14)j++;
19         if(j-i<2)continue;
20         for(int l=2;l<=j-i;l++){
21             for(int k=i;k<=i+l-1;k++){
22                 cnt[k]-=3;
23             }dfs(x+1);
24             for(int k=i;k<=i+l-1;k++)cnt[k]+=3;
25         }
26     }
27     for(int i=3;i<=12;i++){
28         int j=i;while(cnt[j]>=2&&j<=14)j++;
29         if(j-i<3)continue;
30         for(int l=3;l<=j-i;l++){
31             for(int k=i;k<=i+l-1;k++){
32                 cnt[k]-=2;
33             }dfs(x+1);
34             for(int k=i;k<=i+l-1;k++)cnt[k]+=2;
35         }
36     }
37     for(int i=3;i<=10;i++){
38         int j=i;while(cnt[j]&&j<=14)j++;//不能跟2组
39         if(j-i<5)continue;
40         for(int l=5;l<=j-i;l++){
41             for(int k=i;k<=i+l-1;k++){
42                 cnt[k]--;
43             }dfs(x+1);
44             for(int k=i;k<=i+l-1;k++)cnt[k]++;
45         }
46     }
47 }
48 int main()
49 {
50     freopen("landlords.in","r",stdin);freopen("landlords.out","w",stdout);
51     scanf("%d%d",&T,&n);int tot=0;
52     while(T--){
53         memset(cnt,0,sizeof(cnt));
54         for(int i=1;i<=n;i++){
55             int x,y;scanf("%d%d",&x,&y);num[i]=x;
56             if(x==0)num[i]=16;if(x==1)num[i]=14;
57             if(x==2)num[i]=15;cnt[num[i]]++;
58         }mi=0x3fffffff;tot++;
59         dfs(0);cout<<mi<<endl;
60     }
61     return 0;
62 }

斗地主

既然都是看题解写的了...我也不知道啥叫部分分了...

之前瞎搜,搜了200多行才60分,看了题解之后发现其实可以用特别短的代码写完这道题。

首先我们可以发现,花色在本题中是没有影响的,这个还是很容易发现的。

其次我们又可以发现,出牌顺序是无关紧要的,因为你在自己一个人打牌,于是我们可以理解为如何将这些牌分为最少的组(一组代表一次可以打出去的)。

假设手牌中没有顺子,那么我们可以将数字相同的牌划分为一组,然后通过3+1,3+2,4+2来合并这些组,我们发现打完这些牌所需要的最小步数是固定的。

我们大致分为这几种情况:能打4+2+2,那么就打,能打4+1+1,那么就打,能打3+1,3+2,就打。但我们还存在一种特殊情况,本题数据中好像没有可以针对这种情况,好多人都没有考虑,就是有4+1+2的时候,这时候拆掉2,会比只打4再打2再打1要更优。

4和3是永远不要拆掉的,拆成单或者对出肯定是没必要的,那么考虑拆掉3或者4中的一个去给三带或者四带,仔细想想其实很容易发现不可能更优,因为我拆掉一个拿去三带或者四带,我自己本来能带的牌(3是1张,4是2张)就少了一张,而且我给的那一组牌也会少带一张,所以完全没有拆的必要。虽然还有很多种情况,但总不会比不拆更优。emmmm感觉还是没说明白

这样想,我们将3个或者4个称之为“组”,通过比较这两个组的“贡献”来比较谁更优,所谓贡献指的就是能带走除了他俩以外的牌中的几张(我们只考虑单牌不考虑对牌,因为如果本来带的是对,我现在把他破坏掉了,损失会更大)。那么拆掉意味着破坏其中一个组,那么这个组的贡献-1,或者没变(本来就没有多余单牌了),而他被另一组带着,这个组的贡献-1(余下单牌很多),或者+1(4+1+1那种),但如果可以4+1+1,那么这两个1可以同时给之前那一组,而这一组还可以多带点别的,所以拆是完全没有必要的。

思维混乱

大概是这样的吧,,,我们假设我说的是对的。

那么我们就可以dfs了,枚举先打出几个顺子,顺子要枚举所有的可能情况(各种长度),然后一边更新着min值就可以了。

跑了0.012s,效率还是很可以的

转载于:https://www.cnblogs.com/hyghb/p/7650472.html

[NOIP2015] 斗地主相关推荐

  1. 2106. [NOIP2015] 斗地主

    2106. [NOIP2015] 斗地主 ★★★☆   输入文件:landlords.in   输出文件:landlords.out   简单对比 时间限制:2 s   内存限制:1025 MB [题 ...

  2. noip2017考前整理(未完)

    快考试了,把我以前写过的题回顾一下. Noip2007 树网的核:floyd,推出性质,暴力. Noip2008 笨小猴:模拟 Noip2008 火柴棒等式:枚举 Noip2008 传纸条:棋盘dp ...

  3. [杂言] GoodBye,2016

    呼-- 2016年终于要过去了-- 就在这一年,我开始了-- 也就在这一年,我GG了-- 谨以此文纪念我过得不怎么好的2016. 一月 (我还是萌新求轻虐) 当时还在学习背包和深搜,突然dayu把yb ...

  4. NOIP2017暨2017年9月——11月学习总结

    NOIP2017结束了啊..在考场中心情起起伏伏..先是看一眼D2T1就想到思路的小兴奋..又是大样例调不过的紧张..还有找出代码里错误的那一刻的激动..(不知道会不会被卡常啊..)整个比赛的过程还是 ...

  5. [比赛|考试] 9月第一周的考试

    Sept 8th Sat 牛客网普及组赛(360pts/400pts)(100/100/100/60) T1水题不放代码,来个链接 T2乱膜膜就行了,注意膜出来是0要变成N,还有开longlong比较 ...

  6. 【NOIP2015 DAY1 T3 】斗地主(landlords)

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  7. 【NOIP2015提高组Day1】斗地主

    嘿嘿,学老贺乱搞 文章目录 题面 心路历程 题解 官方版本 代码 彭奆版本 本人解法 代码 题面 博弈论??? 贪心??? 一脸懵逼*1??? 一脸懵逼*2??? 一脸懵逼*3??? ???????? ...

  8. 【NOIP2015】洛谷2668 斗地主

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  9. [LOJ2422]【NOIP2015】斗地主

    大名鼎鼎的NOIP2015D1T3 题意: 由于一些众所周知的原因,没有完整题面-- 给你一副斗地主的手牌(牌数<=23),问最少要几次能出完: 包含双王,没有癞子,连对要三连对以上,可以直接出 ...

最新文章

  1. Exchange Server 2010 全新部署篇九:CASHUB中客户端访问功能配置篇
  2. c语言编写系统服务程序,C语言Windows服务程序编写-ServiceMain
  3. Python实现tab文件操作
  4. Python的matplotlib—绘图(3)
  5. 异步提交表单插件jquery.form.min.js的使用实例
  6. ISCSI 1-由零开始
  7. IQueryable接口与IEnumberable接口的区别
  8. Javascript中操作cookie
  9. JavaScript学习(八十九)—数组练习题
  10. C#中的委托与事件 笔记
  11. 【python】Tkinter窗口可视化(二)
  12. jade模板引擎入门教程
  13. CentOS7.4 更改SSH端口号
  14. RBF神经网络-高斯核函数
  15. 柏拉图式爱情 (精神爱情)
  16. 2022年全球市场羊毛纱总体规模、主要生产商、主要地区、产品和应用细分研究报告
  17. Observable与Subject
  18. 《平凡的世界》读后感 — 孙少平篇
  19. CC(标准)版D碟收藏指南(四)
  20. 【Midjourney教程】设计麻瓜也能10分钟上架一套表情包

热门文章

  1. linux 6.5光驱是什么意思,linux 6和5有什么不同
  2. php 个人摄影,展示个人摄影作品的12种方式(ZT)
  3. 人过三十,能不能成大事?看这10个细节足够,听话听音看人看小
  4. 【值得收藏】如此心机的老婆,不难教出一个优秀的女儿。谁娶了都是福。
  5. java故事之致敬坚持梦想的人
  6. 多旋翼油门量与升力关系
  7. 成吉思汗陵举行戊戌年成吉思汗嗣火祭祀
  8. win10 安装虚拟机和乌班图
  9. 转载的ctf练习链接
  10. java循环控制语句,简述Java流程控制语句中的三种循环控制语句,并描述下它们的区别。...