usaco No Change, 2013 Nov 不找零(二分查找+状压dp)
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)的更多相关文章
- 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP
[BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...
- bzoj1725 [Usaco2006 Nov]Corn Fields牧场的安排(状压dp)
1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 714 Solved: 502 ...
- [Usaco2008 Nov]mixup2 混乱的奶牛 简单状压DP
1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 685 Solved: 383[S ...
- BZOJ 1231 [Usaco2008 Nov]mixup2 混乱的奶牛:状压dp + 滚动数组
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1231 题意: 给你n个数字s[i],问你有多少个排列,使得任意相邻两数字之差的绝对值大于m ...
- BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP
Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...
- bzoj 1231: [Usaco2008 Nov]mixup2 混乱的奶牛【状压dp】
设f[i][j]为奶牛选取状态为i,最后一头选的为j,转移直接f[k][(1<<(k-1)|i]+=f[j][i] #include<iostream> #include< ...
- [BZOJ3312][USACO]不找零(状压DP)
Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身上 ...
- 【BZOJ3312】[Usaco2013 Nov]No Change 状压DP+二分
[BZOJ3312][Usaco2013 Nov]No Change Description Farmer John is at the market to purchase supplies for ...
- 没有找零 状压dp
没有找零 状压dp 约翰到商场购物,他的钱包里有K(1 <= K <= 16)个硬币,面值的范围是1..100,000,000.约翰想按顺序买 N个物品(1 <= N <= 1 ...
随机推荐
- Kettle通用数据贴源作业设计
本设计基于以下需求提出 1. 快速接入数据源表(贴源/落地) 2. 无须给单独表开发转换/作业 3. 动态生成数据源连接, 表字段等信息(预先保存在数据仓库中) 本设计所需条件 1. 数据源为关系型数 ...
- OnLineML:时序数据挖掘
关于时序分析: 我们跟随时间的脚步,试图解释现在.理解过去.甚至预测未来........ 原文链接:http://blog.sciencenet.cn/home.php?mod=space&u ...
- 【技术累积】【点】【java】【6】时间戳
闲聊 加班多诶,写博客诶. 基本 时间戳,直观理解就是时间上面盖个戳罢了,在时间这个轴上面记录个点: unix时间戳表示从开始的时间点开始,经过了多少秒: 可以简单的看做是一个计时器: 基本定义可以直 ...
- window窗口操作
打开新窗口 window.open([url],[窗口名称],[参数字符串]) window.open("http://baidu.com","_balnk", ...
- CSS字体代码
宋体 SimSun 黑体 SimHei 微软雅黑 Microsoft YaHei 微软正黑体 Microsoft JhengHei 新宋体 NSimSun 新细明体 PMingLiU 细明体 Ming ...
- ie6 中文字符编码 出现的问题解决
0 前言 公司要求网页要支持ie6.7.8,结果我的设备在ie7.8.9均工作正常,而在ie6时就出现各种奇怪的错误,在这个背景下,开始动手解决网页不兼容ie6的情况. 1 搭建ie6的实验平 ...
- 安装oracle执行runInstaller文件时报错:“……/install/.oui:Permission denied”
一:问题描述 二:出错原因 将windows下未解压的Oracle安装软件上传到了linux服务器,导致有三个文件的执行权限丢失. 三:解决方法 为其赋予相应权限即可. 1: [root@MyPc ~ ...
- javase 超市库存系统
package com.oracle.demo01; import java.util.ArrayList; import java.util.Scanner; public class Demo01 ...
- Python笔记22-----高阶函数
1.sorted(排序对象,key=):排序对象可以是类别,也可以是字符串和字典,key为自定义排序,如:[key=abs,按绝对值排序][key=lambda x:x[1],按排序对象的第二个值排序 ...
- [LeetCode] 75. 颜色分类(荷兰国旗)
class Solution { public: void sortColors(vector<int>& nums) { ,current=,end=nums.size()-; ...