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_i*l)$$

这其中 f 代表在第 i 个点已经买了 j+l 个,其中当前第 i 个点买了 l 个,前 i-1 个点买了 j 个的最小价值。

这样的话可以水到 $90pts$,但是如果是联赛的话应该没有这么高的暴力分。

code

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define N 10005
  4. using namespace std;
  5. int E,K,f[N],n,c[N],x[N],dp[502][N],sum[N];
  6. struct mm
  7. {int c,x,f;}p[N];
  8. namespace AYX
  9. { inline bool cmp(mm i,mm j){return i.x<j.x;}
  10. inline short main()
  11. { scanf("%lld%lld%lld",&K,&E,&n);
  12. for(int i=1;i<=n;++i)scanf("%lld%lld%lld",&p[i].x,&p[i].f,&p[i].c);
  13. memset(dp,0x3f3f3f3f,sizeof(dp));
  14. dp[1][0]=0;
  15. sort(p+1,p+1+n,cmp);
  16. p[n+1].x=E;p[n+1].f=K;
  17. for(int i=1;i<=n+1;++i)sum[i]=sum[i-1]+p[i].f;
  18. for(int i=2;i<=n+1;++i)
  19. for(int j=0;j<=min(K,sum[i-1]);++j)
  20. for(int l=0;l<=p[i-1].f;++l)
  21. { if(l+j>K)break;
  22. 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));
  23. }
  24. printf("%lld\n",dp[n+1][K]);
  25. return 0;
  26. }
  27. }
  28. signed main()
  29. {return AYX::main();
  30. }

part 2 单调队列优化 dp

对式子进行转换,我们能够得到:

$$f_{i,k}=\min(f_{i,j},f_{i-1,j}+(x_i-x_{i-1})jj-c_ij)+c_ik$$

这样 $c_i\times j$ 会变成一个常数,式子只和 i 和 j 有关。

采用单调队列使复杂度降到 $\mathcal O(Kn)$ 稳稳通过。

当然还可以用二进制优化背包来降复杂度,只不过不如单调队列快。

code

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define N 10005
  4. using namespace std;
  5. int E,K,f[N],n,c[N],x[N],dp[502][N],sum[N],dui[N],head,tail;
  6. struct mm
  7. {int c,x,f;}p[N];
  8. namespace AYX
  9. { inline bool cmp(mm i,mm j){return i.x<j.x;}
  10. inline int calc(int i,int j)
  11. {return dp[i-1][j]+(p[i].x-p[i-1].x)*j*j-j*p[i].c;}
  12. inline short main()
  13. { scanf("%lld%lld%lld",&K,&E,&n);
  14. for(int i=1;i<=n;++i)scanf("%lld%lld%lld",&p[i].x,&p[i].f,&p[i].c);
  15. memset(dp,0x3f3f3f3f,sizeof(dp));
  16. dp[0][0]=0;
  17. sort(p+1,p+1+n,cmp);
  18. for(int i=1;i<=n;++i)
  19. { head=1;tail=0;
  20. for(int j=0;j<=K;++j)
  21. { int val=calc(i,j);
  22. while(head<=tail and calc(i,dui[tail])>val)tail--;
  23. while(head<=tail and j-p[i].f>dui[head])++head;
  24. dui[++tail]=j;
  25. dp[i][j]=calc(i,dui[head])+p[i].c*j;
  26. }
  27. }
  28. printf("%lld\n",dp[n][K]+(E-p[n].x)*K*K);
  29. return 0;
  30. }
  31. }
  32. signed main()
  33. {return AYX::main();
  34. }

[USACO10NOV]Buying Feed G的更多相关文章

  1. 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})\time ...

  2. ACM BUYING FEED

    BUYING FEED 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 Farmer John needs to travel to town to pick up ...

  3. 2020: [Usaco2010 Jan]Buying Feed, II

    2020: [Usaco2010 Jan]Buying Feed, II Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 220  Solved: 162[ ...

  4. BUYING FEED

    Problem F: F BUYING FEED Description Farmer John needs to travel to town to pick up K (1 <= K < ...

  5. 洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II

    洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II https://www.luogu.org/problemnew/show/P2616 题目描述 Farmer ...

  6. USACO Buying Feed, II

    洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II 洛谷传送门 JDOJ 2671: USACO 2010 Jan Silver 2.Buying Feed, II ...

  7. 【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 ...

  8. [USACO10NOV]购买饲料Buying Feed 单调队列优化DP

    题目描述 约翰开车来到镇上,他要带 KKK 吨饲料回家.运送饲料是需要花钱的,如果他的车上有 XXX 吨饲料,每公里就要花费 X2X^2X2 元,开车D公里就需要 D×X2D\times X^2D×X ...

  9. P4544 [USACO10NOV]购买饲料Buying Feed

    额,直接思路就dp吧.(我还想了想最短路之类的233但事实证明不行2333.....) 直入主题: 化简题意:在x轴上有n个点,坐标为xi.从原点出发,目标点为e,在途中需要收集K重量的物品,在每个点 ...

随机推荐

  1. MySQL常用权限操作

    MySQL常用权限操作 ** ubuntu mysql 8.0.21修改root密码 ** 1.查看默认安装密码: sudo cat /etc/mysql/debian.cnf 2. 登录mysql ...

  2. 多线程编程<四>

    1 /** 2 * 守护线程daemon['diːmən] 3 * @author Administrator 4 * 5 */ 6 public class DaemonDemo { 7 publi ...

  3. ubuntu开机自启设置 Ubuntu16.04下测试OK

    在~/.config/autostart/目录下,添加xxx.desktop文件,内容如下: [Desktop Entry] Type=Application Name=start apps NoDi ...

  4. JDBC简介及JDBC编写步骤及常见API

    JDBC : Java Database Connectivity,Java数据库连接.SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. JDBC就像一座桥 ...

  5. viper配置管理

    安装 go get github.com/spf13/viper viper支持的功能 1.可以设置默认值 2.可以加载多种格式的配置文件,如JSON,TOML,YAML,HCL和Java属性配置文件 ...

  6. 浅析 Dapr 里的云计算设计模式

    Dapr 实际上是把分布式系统 与微服务架构实践的挑战以及k8s 这三个主题的全方位的设计组合,特别是Kubernetes设计模式 一书作者Bilgin Ibryam 提出的Multi-Runtime ...

  7. 10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(net,net core,C#)

    前言 NuGet就是一个包(package)管理平台,确切的说是 .net平台的包管理工具,它提供了一系列客户端用于生成,上传和使用包(package),以及一个用于存储所有包的中心库. 对于一个现代 ...

  8. 解决win10 cmd运行python弹出windows应用商店下python应用程序

    方法一: 1.我一开始下载完python后,忘记下载到哪个位置,在win10底下输入框搜索python,点击打开文件所在位置,所在位置是python快捷键的位置,直接复制进行环境配置 配置完环境变量后 ...

  9. Python脚本导出AWS EC2资源清单

    环境需求 单位现在每隔一段时间需要核对一下 AWS 正在运行的 EC2 资源清单,为了避免核对失误以及重复性的工作,打算用脚本来解决这一重复性的工作.大概思路为 通过 AWS AK.SK 来索取 AW ...

  10. 再见了,我的散装研发管理平台;再见了,4台ECS!

    周末的时候,收到好几个云服务器临近过期的通知短信,准备续个费,居然都要大几千!因为这几个都是以前低价抢购的,掐指一算,如果都续费的话,要蚕食好多利润!作为一名自己养活自己的独立开发者,节省成本是必备技 ...