[NOIP2015] 斗地主
斗地主
最后还是去看了题解,也算把坑填了吧。感觉大概是懂了,写一下思路。主要是因为还是老感觉哪里别扭想找个地方说出来
先放上代码
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] 斗地主相关推荐
- 2106. [NOIP2015] 斗地主
2106. [NOIP2015] 斗地主 ★★★☆ 输入文件:landlords.in 输出文件:landlords.out 简单对比 时间限制:2 s 内存限制:1025 MB [题 ...
- noip2017考前整理(未完)
快考试了,把我以前写过的题回顾一下. Noip2007 树网的核:floyd,推出性质,暴力. Noip2008 笨小猴:模拟 Noip2008 火柴棒等式:枚举 Noip2008 传纸条:棋盘dp ...
- [杂言] GoodBye,2016
呼-- 2016年终于要过去了-- 就在这一年,我开始了-- 也就在这一年,我GG了-- 谨以此文纪念我过得不怎么好的2016. 一月 (我还是萌新求轻虐) 当时还在学习背包和深搜,突然dayu把yb ...
- NOIP2017暨2017年9月——11月学习总结
NOIP2017结束了啊..在考场中心情起起伏伏..先是看一眼D2T1就想到思路的小兴奋..又是大样例调不过的紧张..还有找出代码里错误的那一刻的激动..(不知道会不会被卡常啊..)整个比赛的过程还是 ...
- [比赛|考试] 9月第一周的考试
Sept 8th Sat 牛客网普及组赛(360pts/400pts)(100/100/100/60) T1水题不放代码,来个链接 T2乱膜膜就行了,注意膜出来是0要变成N,还有开longlong比较 ...
- 【NOIP2015 DAY1 T3 】斗地主(landlords)
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- 【NOIP2015提高组Day1】斗地主
嘿嘿,学老贺乱搞 文章目录 题面 心路历程 题解 官方版本 代码 彭奆版本 本人解法 代码 题面 博弈论??? 贪心??? 一脸懵逼*1??? 一脸懵逼*2??? 一脸懵逼*3??? ???????? ...
- 【NOIP2015】洛谷2668 斗地主
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...
- [LOJ2422]【NOIP2015】斗地主
大名鼎鼎的NOIP2015D1T3 题意: 由于一些众所周知的原因,没有完整题面-- 给你一副斗地主的手牌(牌数<=23),问最少要几次能出完: 包含双王,没有癞子,连对要三连对以上,可以直接出 ...
最新文章
- Exchange Server 2010 全新部署篇九:CASHUB中客户端访问功能配置篇
- c语言编写系统服务程序,C语言Windows服务程序编写-ServiceMain
- Python实现tab文件操作
- Python的matplotlib—绘图(3)
- 异步提交表单插件jquery.form.min.js的使用实例
- ISCSI 1-由零开始
- IQueryable接口与IEnumberable接口的区别
- Javascript中操作cookie
- JavaScript学习(八十九)—数组练习题
- C#中的委托与事件 笔记
- 【python】Tkinter窗口可视化(二)
- jade模板引擎入门教程
- CentOS7.4 更改SSH端口号
- RBF神经网络-高斯核函数
- 柏拉图式爱情 (精神爱情)
- 2022年全球市场羊毛纱总体规模、主要生产商、主要地区、产品和应用细分研究报告
- Observable与Subject
- 《平凡的世界》读后感 — 孙少平篇
- CC(标准)版D碟收藏指南(四)
- 【Midjourney教程】设计麻瓜也能10分钟上架一套表情包