分析:就是不断递归寻找靠近边界的最优解

学习博客(必须先看这个):

1:http://www.cnblogs.com/autsky-jadek/p/3959446.html

2:http://blog.csdn.net/u013849646/article/details/51524748

注:这里用的最小乘积生成树的思想,和dp结合

每次找满足条件的最优的点,只不过BZOJ裸题的满足条件是形成一棵树

这个题是大于m,生成树借用最小生成树进行求解最优,大于m用dp进行求解最优

#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 8e2+;
typedef long long LL;
struct point{
int x, y;
point(int x=,int y=):x(x),y(y){}
point operator -(const point &rhs)const{
return point(x-rhs.x,y-rhs.y);
}
point operator +(const point &rhs)const{
return point(x+rhs.x,y+rhs.y);
}
};
LL cross(point a,point b){
return 1ll*a.x*b.y-1ll*a.y*b.x;
}
int n,m,sum;
int a[N],b[N],c[N];
point p[N];
LL dp[N],f[N],ans;
point get(){
p[]=point(,),dp[]=;
for(int i=;i<=sum;++i)dp[i]=1LL<<;
for(int i=;i<=n;++i){
for(int j=sum;j>=a[i];--j){
if(dp[j]>dp[j-a[i]]+f[i]){
dp[j]=dp[j-a[i]]+f[i];
p[j]=p[j-a[i]]+point(b[i],c[i]);
}
}
}
int ret=m;
LL tot=1LL*p[ret].x*p[ret].y;
for(int i=m+;i<=sum;++i){
if(dp[i]<dp[ret]||dp[i]==dp[ret]&&1ll*p[i].x*p[i].y<tot)
ret=i,tot=1ll*p[i].x*p[i].y;
}
ans=min(ans,tot);
return p[ret];
}
void solve(point A,point B){
for(int i=;i<=n;++i)
f[i]=1ll*c[i]*(B.x-A.x)+1ll*b[i]*(A.y-B.y);
point C=get();
if(cross(B-A,C-A)>=)return;
solve(A,C);solve(C,B);
}
int main(){
while(~scanf("%d%d",&n,&m)){
sum=;
for(int i=;i<=n;++i){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
sum+=a[i];
}
ans=1LL<<;
for(int i=;i<=n;++i)f[i]=b[i];
point A=get();
for(int i=;i<=n;++i)f[i]=c[i];
point B=get();
solve(A,B);
printf("%I64d\n",ans);
}
return ;
}

HDU5697 刷题计划 dp+最小乘积生成树的更多相关文章

  1. BZOJ第一页刷题计划

    BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...

  2. bzoj2395[Balkan 2011]Timeismoney最小乘积生成树

    所谓最小乘积生成树,即对于一个无向连通图的每一条边均有两个权值xi,yi,在图中找一颗生成树,使得Σxi*Σyi取最小值. 直接处理问题较为棘手,但每条边的权值可以描述为一个二元组(xi,yi),这也 ...

  3. 【BZOJ2395】【Balkan 2011】Timeismoney 最小乘积生成树

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  4. Codeforces刷题计划

    Codeforces刷题计划 已完成:-- / -- [Codeforces370E]370E - Summer Reading:构造:(给定某些数,在空白处填数,要求不下降,并且相邻差值<=1 ...

  5. Luogu5540 最小乘积生成树

    Luogu5540 最小乘积生成树 题目链接:洛谷 题目描述:对于一个\(n\)个点\(m\)条边的无向连通图,每条边有两个边权\(a_i,b_i\),求使\((\sum a_i)\times (\s ...

  6. [51nod1614]刷题计划

    大赛将至,摆在你面前的是n道题目,第 i(1 ≤ i ≤ n) 道题目能提升 ai 点智力值,代码量为 bi KB,无聊值为 ci ,求至少提升m点智力值的情况下,所做题目代码量之和*无聊值之和最小为 ...

  7. 【算法】最小乘积生成树 & 最小乘积匹配 (HNOI2014画框)

    今天考试的时候果然题目太难于是我就放弃了……转而学习了一下最小乘积生成树. 最小乘积生成树定义: (摘自网上一篇博文). 我们主要解决的问题就是当k = 2时,如何获得最小的权值乘积.我们注意到一张图 ...

  8. 【NOIP2015模拟11.4】JZOJ8月6日提高组T1 刷题计划

    [NOIP2015模拟11.4]JZOJ8月6日提高组T1 刷题计划 题目 题解 题意 有\(n\)道题,编号为1~\(n\) 给出\(m\)次操作 每次操作有3种类型 1 \(x\) 表示交了\(A ...

  9. Bzoj2395: [Balkan 2011]Timeismoney(最小乘积生成树)

    问题描述 每条边两个权值 \(x,y\),求一棵 \((\sum x) \times (\sum y)\) 最小的生成树 Sol 把每一棵生成树的权值 \(\sum x\) 和 \(\sum y\) ...

随机推荐

  1. AJAX请求也会重新刷新整个页面?

    由于对HTML的一些内置行为不理解,所以面对今天的AJAX请求也会重新绘页面百思不得其解. 后来,请教跟伟哥同属前端组的杨成之后,才知道是由于button的默认行为导致的. 需要阻止这种标签行为,才可 ...

  2. Android ActionBar与ViewPager合用

    内容可以左右滑动,因为使用了ViewPager(我这里用了V4包) view_pager_main.xml <?xml version="1.0" encoding=&quo ...

  3. Java学习笔记之:Java String类

    一.引言 字符串广泛应用在Java编程中,在Java中字符串属于对象,Java提供了String类来创建和操作字符串. 创建字符串最简单的方式如下: String str= "Hello w ...

  4. TCoolMemo

    我们先起个名字叫做TCoolMemo.以上篇已经讲了很多组件的技术,这里就只说出几个重点.其余不多说了. 首先,该Memo从CustomMemo继承,它有这样外观:属于平面的,边框是可以设置颜色的线, ...

  5. Java多线程2:实现多线程的两种方式

    原文:http://www.cnblogs.com/skywang12345/p/3479063.html 常见的实现多线程的方式有2种,一是继承Thread类,二是实现 Runnable接口,还可以 ...

  6. Java API —— 编码 & IO流( InputStreamReader & OutputStreamWriter & FileReader & FileWriter & BufferedReader & BufferedWriter )

    1.编码     1)编码表概述         由字符及其对应的数值组成的一张表     2)常见编码表         · ASCII/Unicode 字符集:ASCII是美国标准信息交换码,用一 ...

  7. csh与bash比较

    csh与bash比较:一.csh的while循环控制结构及if then:#!/bin/csh -fwhile ($#argv >= 1)  if ("$1" == &quo ...

  8. UVa 1402 Runtime Error 伸展树

    Runtime Error 到现在连样例也跑不出来!!! 调试了一晚上快要死了…… 知道错在哪里但是不会改,代码先扔在这里吧.看来不能太依赖模板啊orz…… #include <cstdio&g ...

  9. 简单易懂的命名空间及use的使用

    最近一段时间在研究php框架,一直想的什么时候才能开发出自己的框架,当然这是为了提升自己的编程水平,同时能把平时学的零散的东西糅合在一块熟练应用.但是开发一个框架根本不知道如何做起,先开发什么,虽然p ...

  10. python 字符串换行的三种方式

    if __name__ == '__main__': #第一种: 三个单引号 print ''' aaaaaaaaaaaaaaaa         bbbbbbbbbbbbbb''' #第二种: 三个 ...