Description

约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci 元。今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身上只有 K 张消费卡,第 i 张卡里有 Vi 元余额。

问题是,这些消费卡都是一次性的,它们可以被收银机读取,但如果卡一旦离开了收银机,卡里 的余额就会归零,而且超市也不负责找零!奶牛的队伍很长,不可能再调整她们的位置了,所以一张 卡只能支付一段连在一起的账单。而且,一张账单只能用一张消费卡支付,超市的系统不接受用两张 或以上的卡支付一笔账单。

约翰的问题就是按照什么样的顺序来使用这些消费卡,才能让他能为所有的奶牛买单,而且使得 剩余的消费卡的余额之和最大呢?

Input Format

• 第一行:两个整数 K 和 N ,1 ≤ K ≤ 16, 1 ≤ N ≤ 10^5

• 第二行到第 K + 1 行:第 i + 1 行有一个整数 Vi,1 ≤ Vi ≤ 10^9

• 第 K + 2 行到第 K + N + 1 行:第 i + K + 1 行有一个整数 Ci,1 ≤ Ci ≤ 10^4

Output Format

单个整数:表示约翰买完所有奶牛的单之后,最多还能剩多少余额,如果他带的卡根本没有办 法支付所有的账单,输出 −1。

Sample Input

3 6
12
15
10
6
3
3
2
3
7

Sample Output

12
解释
用 10 元的卡支付前两笔账单,然后用 15 元
的卡支付后面所有的账单,还剩下一张 12 元的卡
没用

Hint

 

Source

No Change, 2013 Nov
我们要维护两个值;
f[i]是到i这个消费卡的使用状态最多能付多少奶牛的账单;
g[i]是在f[i]最大前提下剩余的最多余额;
由于在转移过程中要快速查找当前消费卡从当前位置开始能支付的最长序列;
所以加上二分查找 T((1<<k)logn)
设c为当前消费卡从当前位置开始能支付的最长序列的终点;
那么就有以下方程

  if(c>f[i]||(c==f[i]&g[i-(1<<j-1)]-w[j]>g[i]))
  f[i]=c,g[i]=g[i-(1<<j-1)]-w[j];

 

#include<cstdio>
#include<iostream>
using namespace std;
int a[100010],g[1<<16],f[1<<16],w[20],ans=-1;
int i,j,n,k,inf,l,r,mid;
int find(int st,int x)
{
l=st;r=n+1;a[n+1]=1e9;
int ans;
while(l+1<r)
{
mid=(l+r)>>1;
if(a[mid]-a[st]>x)r=mid;
else l=mid;
}
return l;
}
int main()
{
// freopen("xx.in","r",stdin);
scanf("%d%d",&k,&n);
for(i=1;i<=k;g[0]+=w[i],++i)
scanf("%d",&w[i]);
for(i=1;i<=n;a[i]+=a[i-1],++i)
scanf("%d",&a[i]);
inf=(1<<16)-1;
for(i=1;i<=inf;++i)
{
for(j=1;j<=16;++j)
if(i&1<<j-1)
{
int c=find(f[i-(1<<j-1)],w[j]);
if(c>f[i]||(c==f[i]&g[i-(1<<j-1)]-w[j]>g[i]))
f[i]=c,g[i]=g[i-(1<<j-1)]-w[j];
if(f[i]==n&g[i]>ans)
ans=g[i];
}
}
printf("%d",ans);
}

  

usaco No Change, 2013 Nov 不找零(二分查找+状压dp)的更多相关文章

  1. 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...

  2. bzoj1725 [Usaco2006 Nov]Corn Fields牧场的安排(状压dp)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 714  Solved: 502 ...

  3. [Usaco2008 Nov]mixup2 混乱的奶牛 简单状压DP

    1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 685  Solved: 383[S ...

  4. BZOJ 1231 [Usaco2008 Nov]mixup2 混乱的奶牛:状压dp + 滚动数组

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1231 题意: 给你n个数字s[i],问你有多少个排列,使得任意相邻两数字之差的绝对值大于m ...

  5. BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...

  6. bzoj 1231: [Usaco2008 Nov]mixup2 混乱的奶牛【状压dp】

    设f[i][j]为奶牛选取状态为i,最后一头选的为j,转移直接f[k][(1<<(k-1)|i]+=f[j][i] #include<iostream> #include< ...

  7. [BZOJ3312][USACO]不找零(状压DP)

    Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身上 ...

  8. 【BZOJ3312】[Usaco2013 Nov]No Change 状压DP+二分

    [BZOJ3312][Usaco2013 Nov]No Change Description Farmer John is at the market to purchase supplies for ...

  9. 没有找零 状压dp

    没有找零 状压dp 约翰到商场购物,他的钱包里有K(1 <= K <= 16)个硬币,面值的范围是1..100,000,000.约翰想按顺序买 N个物品(1 <= N <= 1 ...

随机推荐

  1. PostgreSQL 保留关键字添加方法之一,不带参数的函数

    以添加sysdate关键字为例说明: 1.src\backend\parser\gram.y文件的%token <keyword>段添加SYSDATE关键字,建议按照ASCII顺序添加 2 ...

  2. Wireshark抓包过滤

    主要说明下抓包前准备工作,及wireshark里面的两个过滤器:捕获过滤器和应用显示过滤器 1.捕获过滤器.顾名思义就是捕获时的过滤器.主要用来决定你要抓包抓哪个IP哪个端口,明确自己要抓哪个IP和端 ...

  3. 杭电 1040 As Easy As A+B 【排序】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1040 解题思路:数据不大,可以直接用冒泡排序 #include<stdio.h> int ...

  4. 项目随笔@Service("testService")-------第二篇

    在springmvc中使用注解已经司空见惯了,今天见到了@Service("xxx")这种形式,让我大吃一惊.原来在service后面可以加参数,作为该service的名字,在sp ...

  5. 易观OLAP算法大赛结果揭晓,开源组黑马放大招!

    100+天激烈赛程,40+国内顶级技术豪门对决,历经研发内部测试.正式环境测试和易观数据正式环境跑benchmark三大阶段.10月28日,易观OLAP算法大赛优胜名单出炉! 40+技术门派比武 易观 ...

  6. Asp.net Core 源码-PagedList<T>

    using System.Collections.Generic; using System.Linq; using System; using System.Linq.Expressions; us ...

  7. 小白学习Spark系列一:Spark简介

    由于最近在工作中刚接触到scala和Spark,并且作为python中毒者,爬行过程很是艰难,所以这一系列分为几个部分记录下学习<Spark快速大数据分析>的知识点以及自己在工程中遇到的小 ...

  8. [置顶] 来自 HeroKu 的 HTTP API 设计指南(中文版)

    转载:http://get.jobdeer.com/343.get 来自 HeroKu 的 HTTP API 设计指南(中文版) 翻译 by @Easy 简介 本指南中文翻译者为 @Easy ,他是国 ...

  9. JZOJ5804. 【2018.08.12提高A组模拟】简单的序列

    性质:每个位置的前缀和必须大于0,总和=0.以此dp即可. #include <iostream> #include <cstdio> #include <cstring ...

  10. centos7把编译安装的服务通过systemctl管理

    nginx编译安装的目录是/usr/local/nginx nginx配置文件是/usr/local/nginx/conf/nginx.conf systemctl管理的服务文件在/usr/lib/s ...