P4544 [USACO10NOV]Buying Feed G
part 1 暴力
不难发现有一个 $\mathcal O(K^2n)$ 的基础 dp:
$$f_{i,j+l}=\min(f_{i,j+l},f_{i-1,j}+(x_i-x_{i-1})\times j\times j+c_i\times l);$$
这其中 $f$ 代表在第 $i$ 个点已经买了 $j+l$ 个,其中当前第 $i$ 个点买了 $l$ 个,前 $i-1$ 个点买了 $j$ 个的最小价值。
这样的话可以水到 90pts,但是如果是联赛的话应该没有这么高的暴力分。
code
#include<bits/stdc++.h>
#define int short
#define N 105
using namespace std;
int E,K,f[N],n,c[N],x[N],dp[502][N],sum[N];
struct mm
{int c,x,f;}p[N];
namespace AYX
{ inline bool cmp(mm i,mm j){return i.x>j.x;}
inline short main()
{ //freopen("c.in","r",stdin);
//freopen("2.out","w",stdout);
scanf("%lld%lld%lld",&K,&E,&n);
for(int i=1;i<=n;++i)scanf("%lld%lld%lld",&p[i].x,&p[i].f,&p[i].c);
memset(dp,0x3f3f3f3f,sizeof(f));
dp[1][0]=0;
sort(p+1,p+1+n);
p[n+1].x=E;p[n+1].f=K;
for(int i=1;i<=n;++i)sum[i]=sum[i-1]+p[i].f;
for(int i=2;i<=n;++i)
for(int j=0;j<=min(K,sum[i]);++j)
for(int l=0;l<=p[i-1].f;++l)
{ if(l+j>K) braek;
dp[i][j+l]=min(dp[i][j+l],dp[i-1][j]+p[i-1].c*l+(j+l)*(j+l)*(p[i].x-p[i-1].x));
}
printf("%ldl\n",dp[n+1][K]);
return 0;
}
}
signed main()
{return AYX::main();
}
part 2 单调队列优化 dp
对式子进行转换,我们能够得到:
$$f_{i,k}=\min(f_{i,j},f_{i-1,j}+(x_i-x_{i-1})\times j\times j-c_i\times j)+c_i
\times k;$$
这样 $c_i\times j$ 会变成一个常数,式子只和 $i$ 和 $j$ 有关。
采用单调队列使复杂度降到 $\mathcal O(Kn)$ 稳稳通过。
当然还可以用二进制优化背包来降复杂度,只不过不如单调队列快。
code
#include<bits/stdc++.h>
#define int short
#define N 105
using namespace std;
int E,K,f[N],n,c[N],x[N],dp[502][N],sum[N],dui[N],head,tail;
struct mm
{int c,x,f;}p[N];
namespace AYX
{ inline bool cmp(mm i,mm j){return i.x<j.x;}
inline int calc(int i,int j)
{return dp[i-1][j]+(p[i].x-p[i-1].x)-p[i].c;}
inline short main()
{
scanf("%ldl%ldl%ldl",&K,&E,&n);
for(int i=1;i<=n;++i)scanf("%ldl%ldl%ldl",&p[i].x,&p[i].f,&p[i].c);
memset(dp,0x3f3f3f3f,sizeof(dp));
dp[0][0]=0;
sort(p+1,p+1+n);
for(int i=1;i<=n;++i)
{ head=0;tail=1;
for(int j=0;j<=K;++j)
{ int val=calc(i,j);
while(head<=tail and calc(i,dui[tail])>val)tail--;
while(head<=tail and j-p[i].f<dui[head])++head;
dui[+tail+]=j;
dp[i][j]=calc(i,dui[tali])+p[i].c*j;
}
}
printf("%ldl\n",dp[n][K]+(E-p[n].x)*K*K);
return 1;
}
}
signed main()
{return AYX::main();
}
P4544 [USACO10NOV]Buying Feed G的更多相关文章
- [USACO10NOV]Buying Feed G
part 1 暴力 不难发现有一个 $\mathcal O(K^2n)$ 的基础 dp: $$f_{i,j+l}=\min(f_{i,j+l},f_{i-1,j}+(x_i-x_{i-1})jj+c_ ...
- ACM BUYING FEED
BUYING FEED 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 Farmer John needs to travel to town to pick up ...
- 2020: [Usaco2010 Jan]Buying Feed, II
2020: [Usaco2010 Jan]Buying Feed, II Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 220 Solved: 162[ ...
- BUYING FEED
Problem F: F BUYING FEED Description Farmer John needs to travel to town to pick up K (1 <= K < ...
- 洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II
洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II https://www.luogu.org/problemnew/show/P2616 题目描述 Farmer ...
- USACO Buying Feed, II
洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II 洛谷传送门 JDOJ 2671: USACO 2010 Jan Silver 2.Buying Feed, II ...
- 【P2616】 【USACO10JAN】购买饲料II Buying Feed, II
P2616 [USACO10JAN]购买饲料II Buying Feed, II 题目描述 Farmer John needs to travel to town to pick up K (1 &l ...
- P4544 [USACO10NOV]购买饲料Buying Feed
额,直接思路就dp吧.(我还想了想最短路之类的233但事实证明不行2333.....) 直入主题: 化简题意:在x轴上有n个点,坐标为xi.从原点出发,目标点为e,在途中需要收集K重量的物品,在每个点 ...
- [USACO10NOV]购买饲料Buying Feed 单调队列优化DP
题目描述 约翰开车来到镇上,他要带 KKK 吨饲料回家.运送饲料是需要花钱的,如果他的车上有 XXX 吨饲料,每公里就要花费 X2X^2X2 元,开车D公里就需要 D×X2D\times X^2D×X ...
随机推荐
- 关于Junit中Assert已经过时
在junit4.12之后,Assert就过时了,提供了TestCase来取代: 同样在TestCase中原本比较常见的一些方法也已经取消了,例如:assertNotEquals.assertThat. ...
- eval()函数的使用
1.eval() 函数作用:可以接受一个字符串str作为参数,并把这个参数作为脚本代码来 执行. 2.参数情况:(1)如果参数是一个表达式,eval() 函数将执行表达式: (2) 如果参数是Java ...
- TDSQL MySQL版基本原理-水平分表 读写分离 弹性扩展 强同步
TDSQL MySQL版(TDSQL for MySQL)是部署在腾讯云上的一种支持自动水平拆分.Shared Nothing 架构的分布式数据库.TDSQL MySQL版 即业务获取的是完整的逻辑库 ...
- Adaptive AUTOSAR 学习笔记 16 - 时间同步和网络管理
本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf.作者:Zijian/TENG 原文地 ...
- 新版idea无法导入mavenweb模板
目前没有任何办法,最好是下个旧版的
- android activity pass data to accessibilityservice 数据传递
不同类型的 service 传递数据的方式不同,accessibilityservice 运行在独立进程,且被系统接管,比较特别 在 AccessibilityService 的 onCreate 内 ...
- Java基础之类加载器
Java类加载器是用户程序和JVM虚拟机之间的桥梁,在Java程序中起了至关重要的作用,理解它有利于我们写出更优雅的程序.本文首先介绍了Java虚拟机加载程序的过程,简述了Java类加载器的加载方式( ...
- 浅析mybatis中${}和#{}取值区别
mybatis作为一个轻量级的ORM框架,应用广泛,其上手使用也比较简单:一个成熟的框架,必然有精巧的设计,值得学习. 在使用mybatis框架时,在sql语句中获取传入的参数有如下两种方式: ${p ...
- redis 主从复制详解
引言 我们之前操作 Redis 都是单机版,但是实际应用中没人使用单机版,都是搭建集群的方式.这篇文章要介绍的主从复制,是指将一台 Redis 服务器的数据,复制到其他 Redis 服务器,我们将前者 ...
- echo -e 命令详解
echo在php中是输入那么在linux中是不是也是输入呢,当然echo在linux也是输入不过它的用法比php强大多了可以带参数及一些东西,下面我们来看一篇关于linux echo命令介绍及-n.- ...