题目来源: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. 使用厂商MIB库查找设备OID值并实施监控的方法

    https://wenku.baidu.com/view/8f4b389e0029bd64783e2cd0.html

  2. 程序错误通常有2种,一种是运行时错误,这种错误ide会抛出异常,我们可以根据异常寻找问题.

    1.程序错误通常有2种,一种是运行时错误,这种错误ide会抛出异常,我们可以根据异常寻找问题. 2.可以根据异常寻找问题. 3.可以根据异常寻找问题

  3. 【入门篇】ANDROID开发之BUG专讲

    话说诸葛亮是一个优秀的程序员,每个锦囊都是应对不同的case而编写的.可是优秀的程序员也敌只是更优秀的bug.六出祈山.七进中原,鞠躬尽瘁,死而后已的诸葛亮仅仅由于有一个错误的case-马谡,整个结构 ...

  4. 【cl】工程导入

    File>Open 导入成功

  5. 能够在子线程绘画的View SurfaceView

    转载请注明出处:王亟亟的大牛之路 近期两天都没有写文章,一方面是自己在看书.一方面不知道写什么,本来昨天想写Glide或者RxAndroid的东西结果公司的"狗屎"网怎么都刷不好G ...

  6. oc23--变量修饰符

    // // Person.h #import <Foundation/Foundation.h> /* @public:所有类访问 @private:本类访问 @protected:本类子 ...

  7. 国内物联网平台初探(七) ——Ablecloud物联网自助开发和大数据云平台

    平台定位 面向IoT硬件厂商,提供设备联网与管理.远程查看控制.定制化云端功能开发.海量硬件数据存储与分析等基础设施,加速硬件实现联网智能化. 架构 服务 云端服务一体化开发引擎 业内独创一体化开发引 ...

  8. 表格td内容过多时,td显示省略号,鼠标移入显示全部内容。

    转自:https://blog.csdn.net/weixin_42193908/article/details/80405014 两种方式显示: 1.title方式显示: <!DOCTYPE ...

  9. 文档控件NTKO OFFICE 详细使用说明之预览word编辑保存回服务器

    1.在线预览Word文件 (1) 运行环境 ① 浏览器:支持IE7-IE11(平台版本还支持Chrome和Firefox) ② IE工具栏-Internet 选项:将www.ntko.com加入到浏览 ...

  10. P3805 【模版】manacher算法

    题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符串S 输出格 ...