题意:给你n袋豆子,每袋都有w[i]个豆子,接着任选连续任意个袋子的豆子合在一起放入容量为p的多个袋子里(每个袋子必须放满),问剩余的豆子数<=k时,能放满最多的袋子的个数

题解:个数与p都比较大,直接模拟O(n^2),余数处理(dp)O(n*p)都会超时。

我们可以首先抽象出一个公式来:设前缀和为sum[i],则我们求(j+1,i)的豆子的数量时会使用sum[i]-sum[j]来求,而我们需要求的就是max(sum[i]-sum[j]),条件的是

(sum[i]-sum[j])%P<=k ——> (sum[i]%p-sum[j]%p+p)%p<=k

分类讨论:当sum[i]%p>=sum[j]%p    时就是    sum[i]%p-k <= sum[j]%p <= sum[i]%p

     当sum[i]%p<sum[j]%p我们可以反向来看转化为上面的情况

则我们枚举sum[i]时就只需要求出最前面一个满足条件的sum[j]就好(因为w[i]非负)

这样我们找到前缀和求余数数组rem,首先第一关键字rem升序第二关键字下标升序,接着我们枚举rem[现在]时就一定满足rem[现在]>=rem[队首],而rem[现在]-k是非递减的,所以我们可以单调队列来优化,队列里面rem从小到大,当 rem[现在]-k>rem[队首]则出队,最后rem[现在]入队(rem[现在]一定不小于队尾的rem)并向前走到比现在小的下标就好

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1E-8
/*注意可能会有输出-0.000*/
#define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
#define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
#define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
#define mul(a,b) (a<<b)
#define dir(a,b) (a>>b)
typedef long long ll;
typedef unsigned long long ull;
const int Inf=<<;
const double Pi=acos(-1.0);
const int Mod=1e9+;
const int Max=;
int que[Max];//单调队列
struct node
{
int rem;//前缀余数
ll pre;//前缀和
int pos;
}res[Max];
bool cmp(struct node p1,struct node p2)
{
if(p1.rem==p2.rem)
return p1.pos<p2.pos;
return p1.rem<p2.rem;//排序关键
}
ll nmax(ll a,ll b)
{
return a>b?a:b;
}
ll Solve(int n,int p,int k)
{
ll ans=-1ll;
int top=,bot=;
que[top++]=;
for(int i=;i<=n;++i)//遍历x%p 找最小下标
{
while(top>bot&&res[i].rem-k>res[que[bot]].rem)//小于这个值的出队(因为之后这个值会变大)
bot++;
if(top>bot)
ans=nmax(ans,(res[i].pre-res[que[bot]].pre)/(ll)p);
while(top>bot&&res[que[bot]].pos>res[i].pos)//单调队列维护下标最小
bot++;
que[top++]=i;
} return ans;
}
int main()
{
int t,n,p,k,num,coun=;
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d",&n,&p,&k);
res[].rem=,res[].pre=0ll,res[].pos=;//注意加一个
for(int i=;i<=n;++i)
{
scanf("%d",&num);
res[i].pre=res[i-].pre+num;
res[i].rem=res[i].pre%p;
res[i].pos=i;
}
sort(res+,res+n+,cmp);
printf("Case %d: %I64d\n",++coun,Solve(n,p,k));
}
return ;
}

HDU 2430 Beans (单调队列+公式化简)的更多相关文章

  1. hdu2430 Beans 单调队列

    // hdu2430 Beans 单调队列 // // 题目意思: // 求一个sum%p<=k的max(sum/p) // // 结题报告: // 技巧,先求出前缀和,并记录前i项对p取余的值 ...

  2. HDU 3401 Trade(单调队列优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401 题意:炒股.第i天买入一股的价钱api,卖出一股的价钱bpi,最多买入asi股,最多卖出bsi股 ...

  3. Hdu 3410 【单调队列】.cpp

    题意: 给出一个数组,问你对于第i个数,从最后一个比它大的数到它之间比它小的数中最大的那个数的下标,以及它右边到第一个比它大的数中比它小的数中最大的那一个数的下标<下标从1开始>. eg: ...

  4. HDU 5749 Colmerauer 单调队列+暴力贡献

    BestCoder Round #84   1003 分析:(先奉上zimpha巨官方题解) 感悟:看到题解单调队列,秒懂如何处理每个点的范围,但是题解的一句算贡献让我纠结半天 已知一个点的up,do ...

  5. HDU 5289 Assignment(单调队列)

    题意:给T足数据,然后每组一个n和k,表示n个数,k表示最大同意的能力差,接下来n个数表示n个人的能力,求能力差在k之内的区间有几个 分析:维护一个区间的最大值和最小值,使得他们的差小于k,于是採用单 ...

  6. HDU - 3530 Subsequence (单调队列)

    Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. hdu 3530 Subsequence 单调队列

    题目链接 题目给出n个数, 一个下界m, 一个上界k, 让你求出最长的一段序列, 满足这段序列中的最大的数-最小的数<=k&&>=m, 输出这段长度. 可以维护两个队列, ...

  8. HDU - 6444(单调队列+思维)

    链接:HDU - 6444 题意:给出一个包含 n 个数的环,每个数都有一个价值,起点任选,每次跳顺时针跳 k 个数,在哪个数就能获得该价值(包括起点),最多取 m 次,问最少需要补充多少价值,所拿的 ...

  9. HDU 3507 PrintArticle (单调队列优化)

    题意:给出一个数列C,一个数字M,将数列分成若干段,每段的代价为(设这段的数字为k个): dp[i]=min(dp[j]+(sum[i]-sum[j])*(sum[i]-sum[j])+M) 若j1& ...

随机推荐

  1. UTI 唯一类型标识

    本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6657231   applicationdocumentationtypessys ...

  2. 编写自己的ls命令

    ····要编写ls命令,首先要了解它能做什么,完成了什么工作,是如何完成这些工作的····  一.ls命令能做什么? 我们在命令行输入ls,ls默认找出当前目录中所有文件的文件名,并且按照字典序排序后 ...

  3. 1603 限高二叉排列树(计数DP)

    1603 限高二叉排列树 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题   作为游戏魔方的编写者和管理员,Bob在很多主存模块中 ...

  4. linux解压war包

    可以用unzip命令 unzip project.war -d project 这样就在当前目录下解压project.war到project目录里面,参数-d的意思是创建project目录 附:unz ...

  5. SharePoint服务器端对象模型 之 访问文件和文件夹(Part 3)

    (三)遍历 文件系统的遍历是指按照文件夹的层级结构遍历文档库.列表的文件夹和列表条目.遍历主要有三种方式:(1)直接使用文件系统对象模型进行遍历:(2)使用SPDocumentLibrary进行遍历: ...

  6. maven仓库添加本地jar

    一.将jar添加到本地仓库的做法: 以下面pom.xml依赖的jar包为例: 实际项目中pom.xml依赖写法: <dependency> <groupId>org.sprin ...

  7. solr删除数据(全删除)

    背景:数据索引错了,不想要了.也不想一条条删! 方法: 1.在solr客户端,访问你的索引库(我认为最方便的方法) 1)documents type 选择 XML 2)documents 输入下面语句 ...

  8. Beanutils-No origin bean specified问题分析

    copyProperties 时候系统中报错了,呵呵,源码已经说明了一切,就不BB了

  9. Springboot 热部署中存在冲突的问题

    SpringBoot热部署有2中: 1.使用 Spring Loaded 2.使用 spring-boot-devtools 具体怎么用.自己百度! 在使用第一种时候,整合SpringBoot和通用M ...

  10. java javassis crack class

    java javassis crack class java 反编译 android 反编译   1. jad http://varaneckas.com/jad/jad158e.linux.inte ...