hdu2430Beans(单调队列)
Suppose the size of the packet is P units. Firstly, Mr. Pote selects some bags (at least one) of beans with consecutive number in his warehouse. Then he takes out the beans from all selected bags, and puts them together on the desktop. To pack the beans, he take P units of beans from desktop and fill in a new packet each time, until the beans left are less than P units. Finally the beans left on the desktop are eaten by a lucky dog.
Mr. Pote doesn't want the dog eat too many beans, so he prefers to solutions that resulting no more than K units of beans eaten by the dog. Moreover, he also wants to pack as many packets as possible. Could you tell him how many packets he can pack at most without breaking his preference?
Input On the first line of input, there is a single positive integer T <= 20 specifying the number of test cases to follow.
Each test case contains two lines.
There are three integers in the first line, N, P, K as described above. (0 < N, P < 1000001, 0 <= K < P)
Next follow a line with N integers W1, W2, ..., WN. The i-th integers describes the amount of beans in the bags numbered i. (0 <= Wi < 32768)
Numbers are separated by spaces.
Output For each test case you should output a single line containing "Case X: Y" (quotes for clarity) where X is the number of the test case (starting at 1) and Y is the maximum number of packets that Mr. Pote can pack following his way.
In case there's no solution avoiding the dog eats more than K units of beans, Y should be equal to -1.
Sample Input
3
10 20 10
0 3 1 8 19 39 2 9 1 8
3 100 10
32 34 23
1 5 3
1
Sample Output
Case 1: 4
Case 2: -1
Case 3: 0
题意:
先t组输入,之后输入n、p、k
n:有n袋豆子
p:重新装袋后每袋中豆子的数量
k:狗粮不能超过多少豆子
后边在输入n袋豆子中,每一袋里面豆子的数量
让你从n袋豆子中挑选出来连续的袋子,再将所有豆子重装进p数量的袋子,问最多能装多少袋(在狗粮不超过k的情况下)
题解:
详解原文:传送门
首先我们要求选出来连续的袋子,那么肯定要预处理一下前缀和(这里记为sum[i],rem[i]=sum[i]%p)
我们就是再求(sum[i]-sum[j])/p (i>j)的最大值,要保证(sum[i]-sum[j])%p<=k
当sum[i]>=sum[j]时:
可化简至:sum[i]%p-sum[j]%p<=k ===>>> rem[i]-rem[j]<=k
只需要在满足此条件下,找到最大的sum[i]-sum[j]就可以了,而且这一点还可以用单调递增队列来维护,每次取队头来和sum[i]做计算就可以了
当sum[i]<sum[j]时
有sum[i]%p-sum[j]%p+p<=k =====>>>> rem[i]-rem[j]+p<=k =====>>>> rem[i]<=k+(rem[j]-p)
因为rem<p 所以 rem[i]<k
而且(sum[i]-sum[j])<sum[i]
所以我们可以处理一下前缀和sum[i],来取最大的sum[i]/p
代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=1e5+10;
7 struct shudui
8 {
9 int sum,id,rem;
10 }m[maxn];
11 bool mmp(shudui x,shudui y)
12 {
13 if(x.rem==y.rem)
14 return x.id<y.id;
15 else return x.rem<y.rem;
16 }
17 int que[maxn];
18 int main()
19 {
20 int t,tt=0;
21 scanf("%d",&t);
22 while(t--)
23 {
24 int n,p,k;
25 scanf("%d%d%d",&n,&p,&k);
26 m[0].sum=0;
27 for(int i=1;i<=n;++i)
28 {
29 int q;
30 scanf("%d",&q);
31 m[i].sum=m[i-1].sum+q;
32 m[i].rem=m[i].sum%p;
33 m[i].id=i;
34 }
35 sort(m+1,m+1+n,mmp);
36 int s=1,e=0,ans=0,flag=0;
37 for(int i=1;i<=n;++i)
38 {
39 while(e>=s && m[que[e]].id>m[i].id)
40 e--;
41 while(e>=s && m[i].rem-m[que[s]].rem>k)
42 s++;
43 que[++e]=i;
44 if(m[i].rem<=k)
45 ans=max(ans,m[i].sum/p),flag=1;
46 if(e>s && m[i].rem-m[que[s]].rem<=k)
47 ans=max(ans,(m[i].sum-m[que[s]].sum)/p),flag=1;
48 }
49 if(flag)
50 printf("Case %d: %d\n",++tt,ans);
51 else printf("Case %d: -1\n",++tt);
52 }
53 return 0;
54 }
hdu2430Beans(单调队列)的更多相关文章
- BestCoder Round #89 B题---Fxx and game(单调队列)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945 问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路: B ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
- BZOJ 1047 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...
- 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列
第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- hdu 3401 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- 【转】单调队列优化DP
转自 : http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...
- hdu3530 单调队列
Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
随机推荐
- version can neither be null, empty nor blank
在用mybatis-generator逆向生成mapper和DAO的时候,出现了这个错误. mybatis-generator:generate 原因是在pom.xml中我的mysql依赖没有写版本号 ...
- Java 多线程读取文件并统计词频 实例 出神入化的《ThreadPoolExecutor》
重在展示多线程ThreadPoolExecutor的使用,和线程同步器CountDownLatch,以及相关CAS的原子操作和线程安全的Map/队列. ThreadPool主线程 1 import j ...
- ctfhub技能树—信息泄露—PHPINFO
打开靶机 查看页面,是PHP info界面 只有这一个页面,查找一下有没有flag 拿到flag 浅谈ctf中phpinfo需要关注的点(转自先知社区) 1 https://xz.aliyun.com ...
- .NET 项目中的单元测试
.NET 项目中的单元测试 Intro "不会写单元测试的程序员不是合格的程序员,不写单元测试的程序员不是优秀的工程师." -- 一只想要成为一个优秀程序员的渣逼程序猿. 那么问题 ...
- linux串口编程
按照对linux系统的理解,串口编程的顺序无非就是open,read,write,close,而串口有波特率.数据位等重要参数需要设置,因此还应该用到设置函数,那么接下来就带着这几个问题去学习linu ...
- 微博CacheService架构浅析 对底层协议进行适配
https://mp.weixin.qq.com/s/wPR0j2bmHBF6z0ZjTlz_4A 麦俊生 InfoQ 2014-04-21 微博作为国内最大的社交媒体网站之一,每天承载着亿万用户的服 ...
- 自己动手实现java断点/单步调试(一)
又是好长时间没有写博客了,今天我们就来谈一下java程序的断点调试.写这篇主题的主要原因是身边的公司或者个人都执着于做apaas平台,简单来说apaas平台就是一个零代码或者低代码的配置平台,通过配置 ...
- docker(mysql-redmine)
一.安装docker 首先查看自己的版本,我的是centos 版本为 [root@localhost redmine]# uname -r 3.10.0-862.el7.x86_64 移除旧版本 yu ...
- Spring Cloud与Docker——微服务架构概述
Spring Cloud与Docker--微服务架构概述 单体应用架构概述 微服务概述 微服务的特性 微服务架构的优点 微服务面临的挑战 微服务的设计原则 单体应用架构概述 传统的服务发布都是采用单体 ...
- centos安装、升级新火狐最新版 31
1.登录火狐主页 下载最新版本firefox-31.0.tar.bz2 解压: tar -jxvf firefox-31.0.tar.bz2 2.然后把旧版本的firefox卸掉 # yum eras ...