题目来源:2018集训队互测 Round17 T2

题意:

题解:

显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz!

显然不会无解……

为了方便计算石子个数,在最后面加一堆$a_i=c_i=\infty$的石子,确保每次取石子都可以取满$k$个;

先考虑$a_i=0$的情况:

设$f_{i,j}$表示只考虑第0到$i$堆石子,通关前$j$轮的最少操作次数;

设$g_{i,j}$表示只考虑第0到$i$堆石子,前$j$轮结束后再取若干次石子,每次取$k$个,使得第$i$堆前面的所有石堆都被取尽的最少操作次数;

分别记$sa,sb$为$a,b$的前缀和;

从小到大枚举$i,j$,每次考虑加入石堆$i$的影响,分两种情况转移:

若存在一种方案使得不取第$i$堆石子即可通关前$j$轮,此时需满足$j\times b_i\leq c_i$且$f_{i-1,j}\neq\infty$;

则转移为:

$f_{i,j}\leftarrow f_{i-1,j}$

$g_{i,j}\leftarrow \lceil\frac{j\times sb_{i-1}}{k}\rceil$

第二种转移需要满足石子总数够取,即$\lceil\frac{j\times sb_{i-1}}{k}\rceil\times k\leq j\times sb_i$;

否则枚举最后一次取$i$的轮数$r$,此时最优策略一定是分成三部分:

1.在前$r$轮取完$[0,i)$中的石子,这部分答案显然为$g_{i,r}$

2.这轮在$i$中取若干次石子,此时$i$中剩余石子数为$m=r\times sb_i-k\times g_{i,r}$,为了使它在$j$轮后不超过限制,还需要取$x=\lceil\frac{max(0,m+(j-r)\times b_i-c_i)}{k}\rceil$次;若$x\times k>m$,即石子不够取,则无解;

3.在剩余的$j-r$轮中取石子,这部分跟第一种情况类似,可以得到$f$的操作数为$f_{i-1,j-r}$,$g$的操作数为$g_{i,j}$;

因此转移就是:

$f_{i,j}\leftarrow g_{i,r}+f_{i-1,j-r}+x$

$g_{i,j}\leftarrow g_{i,r}+\lceil\frac{(j-r)\times sb_{i-1}}{k}\rceil+x$

时间复杂度$O(nt^2)$;

考虑$a_i\neq 0$的情况,可以发现此时对dp的影响只有第二种情况的第三步中,所有石堆的个数都为0;那么直接在$f,g$后面加一维0/1位表示每堆石子初始时是否有值,在第三步转移中用$f_{i-1,j-r,0}$转移,每次计算剩余石子时注意初始的$a_i$即可;

代码看(chao)了天下第一wxh的代码

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 100000000000000000
#define eps 1e-9
using namespace std;
typedef long long ll;
typedef double db;
int n,t,k;
ll tmp,tt,m,a[],b[],c[],sa[],sb[],f[][][],g[][][];
int main(){
scanf("%d%d%d",&n,&t,&k);
for(int i=;i<=n;i++){
scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
sa[i]=sa[i-]+a[i];
sb[i]=sb[i-]+b[i];
}
n++;
a[n]=c[n]=sa[n]=inf;
sb[n]=sb[n-];
for(int i=;i<=n;i++){
for(int j=;j<=t;j++){
for(int t=;t<=;t++){
f[i][j][t]=g[i][j][t]=inf;
//transform 1
if(j*b[i]+t*a[i]<=c[i]&&f[i-][j][t]!=inf){
f[i][j][t]=f[i-][j][t];
tmp=(j*sb[i-]+t*sa[i-]+k-)/k;
if(tmp*k<=j*sb[i]+t*sa[i]){
g[i][j][t]=tmp;
}
}
//transform 2
for(int r=;r<j;r++){
if(g[i][r][t]!=inf){
m=r*sb[i]+t*sa[i]-k*g[i][r][t];
tmp=(max(0ll,m+(j-r)*b[i]-c[i])+k-)/k;
if(tmp*k<=m&&f[i-][j-r][]!=inf){
f[i][j][t]=min(f[i][j][t],f[i-][j-r][]+g[i][r][t]+tmp);
tt=((j-r)*sb[i-]+k-)/k;
if(tt*k<=(j-r)*sb[i]+m-tmp*k){
g[i][j][t]=min(g[i][j][t],g[i][r][t]+tmp+tt);
}
}
}
}
}
}
}
printf("%lld",f[n][t][]);
return ;
}

【2018集训队互测】【XSY3372】取石子的更多相关文章

  1. 【loj2461】【2018集训队互测Day 1】完美的队列

    #2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...

  2. [JZOJ6088] [BZOJ5376] [loj #2463]【2018集训队互测Day 1】完美的旅行【线性递推】【多项式】【FWT】

    Description Solution 我们考虑将问题一步步拆解 第一步求出\(F_{S,i}\)表示一次旅行按位与的值为S,走了i步的方案数. 第二步答案是\(F_{S,i}\)的二维重复卷积,记 ...

  3. 【LOJ2461】「2018 集训队互测 Day 1」完美的队列(分块+双指针)

    点此看题面 大致题意: 让你维护\(n\)个有限定长度的队列,每次区间往队列里加数,求每次加完后的队列里剩余元素种类数. 核心思路 这道题可以用分块+双指针去搞. 考虑求出每个操作插入的元素在队列中被 ...

  4. @loj - 2461@ 「2018 集训队互测 Day 1」完美的队列

    目录 @description@ @solution@ @part - 0@ @part - 1@ @accepted code@ @details@ @description@ 小 D 有 n 个 ...

  5. LOJ2476. 「2018 集训队互测 Day 3」蒜头的奖杯 & LOJ2565. 「SDOI2018」旧试题(莫比乌斯反演)

    题目链接 LOJ2476:https://loj.ac/problem/2476 LOJ2565:https://loj.ac/problem/2565 题解 参考照搬了 wxh 的博客. 为了方便, ...

  6. 洛谷 P4463 - [集训队互测 2012] calc(多项式)

    题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ...

  7. 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)

    题目 描述 ​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: ​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...

  8. EZ 2018 05 06 NOIP2018 慈溪中学集训队互测(五)

    享受爆零的快感 老叶本来是让初三的打的,然后我SB的去凑热闹了 TM的T2写炸了(去你妹的优化),T1连-1的分都忘记判了,T3理所当然的不会 光荣革命啊! T1 思维图论题,CHJ dalao给出了 ...

  9. UOJ#191. 【集训队互测2016】Unknown 点分治 分治 整体二分 凸包 计算几何

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ191.html 题目传送门 - UOJ191 题意 自行移步集训队论文2016中罗哲正的论文. 题解 自行 ...

随机推荐

  1. Drop a database in MongoDB

    http://www.linuxask.com/questions/drop-a-database-in-mongodb Drop a database in MongoDB Answer: Assu ...

  2. jQuery Mobile中$.mobile.buttonMarkup方法使用具体解释

    近期在群里遇到多数网友提到$.mobile.buttonMarkup()方法的使用. 我这里就列了一下api的使用说明,以后大家看博客就能解决这个问题.如有不对的地方,请留言指出! jQuery Mo ...

  3. Github Pages 建立过程记录

    之前建立过一个測试页面. 如今在折腾CreateJS 试着把离线版的文档传到github pages上面. 第一步:创建Repository 第二步:本地初始化 主要命令:git init 第三步:复 ...

  4. luogu1541 乌龟棋 动态规划

    题目大意 一行格子,每个格子里有数字.一些卡片,卡片上有1.2.3.4这几种数字.一开始你在格子1,随后每次选一个卡片,你可以前进卡片上的数字个格子,得到格子上的分数,然后讲该卡片丢弃.求取卡片的顺序 ...

  5. nyoj--523--亡命逃窜(BFS水题)

    亡命逃窜 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 从前有个叫hck的骑士,为了救我们美丽的公主,潜入魔王的老巢,够英雄吧.不过英雄不是这么好当的.这个可怜的娃被魔 ...

  6. MySQL-TokuDB:MySQL 高性能存储引擎:TokuDB

    ylbtech-MySQL-TokuDB:MySQL 高性能存储引擎:TokuDB 1.返回顶部 1. 在安装MariaDB的时候了解到代替InnoDB的TokuDB,看简介非常的棒,这里对ToduD ...

  7. Linux&nbsp;Oracle服务启动&amp;停止脚本与开机自启动

    在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...

  8. [Java] 总结1.5/1.6/1.7版本的特性

    开发过程中接触到了从jdk1.5---jdk1.7的使用,在不同的阶段,都使用过了jdk的一些新特性,操作起来更加方面啦!特此总结了下,以下是测试代码: JDK1.5新特性: 1.自动装箱与拆箱: I ...

  9. 爬虫—分析Ajax爬取今日头条图片

    以今日头条为例分析Ajax请求抓取网页数据.本次抓取今日头条的街拍关键字对应的图片,并保存到本地 一,分析 打开今日头条主页,在搜索框中输入街拍二字,打开开发者工具,发现浏览器显示的数据不在其源码里面 ...

  10. MyBatis输出执行的SQL到控制台

    src\main\resources\application.properties 或者src\main\resources\application.yml 在你的application.proper ...