Codeforces 1110 D

题意:给\(n\)个麻将,每个麻将上有一个\(1..m\)的整数\(a_i\)。

现在要将这些麻将们分成一个一个三元组,有两种情况:

  • \([i-1,i,i+1]\)
  • \([i,i,i]\)

然后问最多能将这些麻将们分成多少个三元组。

思路1:

结论:对于每一个三元组\([i-1,i,i+1]\),其出现的次数不会超过两次

证明:

我们如果有\(3\)个\([i-1,i,i+1]\)这种三元组,那么我们可以将其转化成\([i,i,i]\)、\([i-1,i-1,i-1]\)、\([i+1,i+1,i+1]\)这\(3\)个三元组,得到同样的效果。

那么就可以考虑\(dp\)了。

考虑\(dp(i,j,k)\)表示当前已经到了第\(i+1\)个位,\([i-1,i,i+1]\)出现了\(j\)次,\([i-2,i-1,i]\)出现了\(k\)次,最多可以形成的三元组个数。至于状态为什么是这样呢,就是想我们的\(i\)麻将被分到了哪些三元组中,其中和前\(i+1\)个有关的就是这两个。

然后转移的话枚举\([i,i+1,i+2]\)这个三元组出现的次数\(l\),然后\(i\)麻将剩下可以供\([i,i,i]\)的三元组使用的数量就是\(cnt_i-j-k-l\),将\(dp(i+1,k,l)\)赋成\(dp(i,j,k)\)加上这个值\(/3\)再加上\(l\)就行了。

思路2:

我们不考虑\([i-1,i,i+1]\)出现了多少次,我们只考虑被\([i,i,i]\)的三元组用过了之后的\(i\)麻将还剩下多少个。事实证明这个不会超过\(9\)个。为什么呢?首先我们的\(i\)被\([i-2,i-1,i]\)用了最多两次,\([i-1,i,i+1]\)用了最多两次,又被\([i,i+1,i+2]\)用了最多两次,再剩下\([i,i,i]\)一次的余量。

然后也是考虑\(dp\)。\(dp(i,j,k)\)表示当前到了第\(i\)个麻将,\(i-1\)还剩下了\(j\)个,\(i-2\)还剩下\(k\)个。然后转移的时候枚举现在对于\([i-2,i-1,i]\)这个三元组用\(l\)个,肯定是小于等于\(j\)和\(k\)的,那么再看\(cnt_i\)用了\(l\)个后还剩下多少,剩下的如果全用\([i,i,i]\)还剩下多少,记这个值为\(x\),再看如果少用几个\([i,i,i]\)变成了多少,是\(x+3y\)个,其中\(x+3y\)应该小于等于\(cnt_i\)和\(9\)。

然后转移到\(dp(i+1,k,x+3y)\)就好辣。

【Codeforces 1110D】Jongmah的更多相关文章

  1. 【Codeforces 1110D】Jongmah FST分析

    Codeforces 1110 D FST分析 dotorya.FizzyDavid.MofK.gamegame.matthew99.chokudai.eddy1021.DBradac.Happy_N ...

  2. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  3. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  4. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  5. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  6. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  7. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  8. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  9. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

随机推荐

  1. PHP FastCGI进程管理器PHP-FPM的架构

    一个master进程,支持多个pool,每个pool由master进程监听不同的端口,pool中有多个worker进程.每个worker进程都内置PHP解释器,并且进程常驻后台,支持prefork动态 ...

  2. 设计模式-享元模式(FlyWeight)

    一.概念 享元模式是对象的结构模式,它以共享的方式高效的支持大量的细粒度对象,减少对象的数量,并达到节约内存的目的. 享元对象能够做到共享的关键,主要是区分了内部状态和外部状态,内部状态是对象是在建立 ...

  3. 通过kubernetes构建ela服务

    一.kubernetes 通过yaml 创建pod与service apiVersion: extensions/v1beta1 kind: Deployment metadata: name: el ...

  4. Linux常用基本命令:三剑客命令之-awk模式用法(1)

    再次回顾一下,awk基本语法格式: awk [options] 'Pattern {Action}' file1 file2 ··· 之前的文章有讲过两种Pattern(BEGIN, END),本文, ...

  5. linux学习笔记-开机流程与主引导分区(MBR)

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 读鸟哥的linux私房菜-基础学习篇(第三版)3.2.4章节作此笔记 一.术语介绍: Bios:写入到主板上的一个程序,计算机开 ...

  6. HBuilder离线打包启用Chrome Inspect调试

    解决方法: 修改这个文件 assets/data/dcloud_control.xml <msc version="1.9.9.39354" debug="true ...

  7. EF 更新部分字段写法

    EF 更新部分字段写法 1.EF默认是查询出来,修改后保存: 2.设置不修改字段的IsModified为false,此方法不需要先从数据库查询出实体来(最优方法): db.Set<T>() ...

  8. 使用Tampermonkey(油猴) 插件,重新实现了,百度搜索热点过滤功能

    昨天晚上,花了点时间学习了Chrome插件的制作方法,并书写了<Chrome 百度搜索热点过滤插件 - 开源软件>这一文章,简单地介绍自己实现的百度搜索热点过滤神器的原理和使用方式,并进行 ...

  9. zabbix-Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused

    监控zabbix服务端这台服务器,然后显示Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Conne ...

  10. MySQL安全模式:sql_safe_updates讲解

    什么是安全模式 在mysql中,如果在update和delete没有加上where条件,数据将会全部修改.不只是初识mysql的开发者会遇到这个问题,工作有一定经验的工程师难免也会忘记写入where条 ...