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

 Input
  第一行两个整数n,m(0<n<=400)
  接下来n行每行三个整数,ai,bi,ci(0<bi,ci<=1000,0<ai<=800)。
  0<m<=Σai<=800
 Output
  一个数,至少提升m点智力值的情况下,所做题目代码量之和*无聊值之和的最小值。

  思路和求最小乘积生成树一样。。。不同的就是具体计算的时候是01背包而不是求mst。。。

  大概就是将一个方案的b值之和看成X坐标,c值之和看成Y坐标。那么答案的方案肯定就在所有点组成的凸包的左下部分上。

  直接丢题解网址了...http://www.51nod.com/onlineJudge/problemSolution.html#!problemId=1614

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define d double
#define ld long double
const int maxn=; struct zs{int x,y;ll v;}f[maxn],a[maxn];
ll ANS,inf=1ll<<;int SMA;
int A[maxn];
int i,j,k,n,m; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while(rx<''&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>='')ra=ra*+rx-,rx=getchar();return ra*fh;
} //bool operator <(zs a,zs b){return a.v<b.v;}
zs operator +(zs a,zs b){return (zs){a.x+b.x,a.y+b.y,a.v+b.v};}
zs operator -(zs a,zs b){return (zs){a.x-b.x,a.y-b.y,a.v-b.v};}
inline int cross(zs a,zs b){return a.x*b.y-a.y*b.x;} inline void upd(zs &a,zs &b,zs &c){if(b.v+c.v<a.v)a=b+c;}
inline zs get(){
register int i,j,k;zs ans=(zs){,,inf};
for(i=;i<=SMA;i++)f[i].v=inf;
for(i=;i<=n;i++)
for(j=SMA,k=j-A[i];j>=A[i];j--,k--)upd(f[j],f[k],a[i]);
for(j=m;j<=SMA;j++){
if(f[j].v<ans.v)ans=f[j];
if(1ll*f[j].x*f[j].y<ANS)ANS=1ll*f[j].x*f[j].y;
}
return ans;
}
inline void run(zs A,zs B){
for(register int i=;i<=n;i++)a[i].v=a[i].x*(A.y-B.y)+a[i].y*(B.x-A.x);
zs C=get();
if(cross(B-A,C-A)>=)return;
run(A,C),run(C,B);
} int main(){
n=read(),m=read();
for(i=;i<=n;i++)A[i]=read(),a[i].x=read(),a[i].y=read(),SMA+=A[i]; ANS=inf;
for(i=;i<=n;i++)a[i].v=a[i].x;zs A=get();
for(i=;i<=n;i++)a[i].v=a[i].y;zs B=get();//printf("sty:%d (%d,%d) stx:%d (%d,%d)\n",A.v,A.x,A.y,B.v,B.x,B.y);
//printf("ANS:%lld\n",ANS);
run(A,B);
printf("%lld\n",ANS);
}

[51nod1614]刷题计划的更多相关文章

  1. Codeforces刷题计划

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

  2. BZOJ第一页刷题计划

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

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

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

  4. leetcode每日刷题计划-简单篇day5

    刷题成习惯以后感觉挺好的 Num 27 移除元素 Remove Element 跟那个排序去掉相同的一样,len标记然后新的不重复的直接放到len class Solution { public: i ...

  5. leetcode每日刷题计划-简单篇day3

    收到swe提前批面试hhh算是ep挂了的后续 努力刷题呀争取今年冲进去! Num 21 合并两个有序链表 Merge Two Sorted Lists 注意新开的链表用来输出结果的是ListNode ...

  6. leetcode每日刷题计划-简单篇day1

    orzorz开始刷题 争取坚持每周平均下来简单题一天能做两道题吧 非常简单的题奇奇怪怪的错误orz越不做越菜 Num 7 整数反转 Reverse Integer 刚开始多给了一个变量来回折腾占地方, ...

  7. NOI Online 赛前刷题计划

    Day 1 模拟 链接:Day 1  模拟 题单:P1042 乒乓球  字符串 P1015 回文数  高精 + 进制 P1088 火星人  搜索 + 数论 P1604 B进制星球  高精 + 进制 D ...

  8. Noip刷题计划

    写在前面 去年也想刷10年NOIP来着..结果刷到13年就没动力了233... 今年一定要完成目标啊!! "愿你明日重生,醒时心存冬阳" 2018年 题目 首次得分 出错原因 考点 ...

  9. Leetcode 刷题计划

    Two Sum    21.4%    Medium Given an array of integers, return indices of the two numbers such that t ...

随机推荐

  1. Java中数据类型及其之间的转换(转)

    Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...

  2. ES6初体验

    开始学习ES6,打算走全栈这条路了,废话不多说,开始吧. 首先安装node环境,去node官网上面下载node最新版本的,我用的系统是window10,所以我只需要下一步下一步就行了,安装完成后打开c ...

  3. MySQL操作时间的函数集

    求两个Timestamp之间的秒差值: select TIMESTAMPDIFF(SECOND,TIMESTAMP("2017-03-01 07:58:20"),timestamp ...

  4. 模板引擎(smarty)知识点总结五

    ---------重点知识:循环------------ /*   smarty 循环之for循环 */ /*    基本的语法         {for $i=$start to $end step ...

  5. .NET使用DAO.NET实体类模型操作数据库

    一.新建项目 打开vs2017,新建一个项目,命名为orm1 二.新建数据库 打开 SqlServer数据库,新建数据库 orm1,并新建表 student . 三.新建 ADO.NET 实体数据模型 ...

  6. .net中如何实现多线程

    l线程肯定也是要执行一段代码的.所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码.(找个人来做一件事情) l线程启动时,通过委托调用该方法. (委托的好处) ...

  7. Oracle添加记录的时候报错:违反完整性约束,未找到父项关键字

    今天需要向一个没有接触过的一个Oracle数据库中添加一条记录,执行报错: 分析: 报错的根本原因:未找到父项关键字的原因是因为你在保存对象的时候缺失关联对象. 问题的解决思路:先保存关联对象后再保存 ...

  8. Disruptor并发框架 (二)核心概念场景分析

    核心术语 RingBuffer(容器): 被看作Disruptor最主要的组件,然而从3.0开始RingBuffer仅仅负责存储和更新在Disruptor中流通的数据.对一些特殊的使用场景能够被用户( ...

  9. Python学习_11_类和实例

    类和实例 类是对象创建实例的模板,而实例则是对象的实体.类使用class关键字定义: class MyClass:    pass python中创建实例直接使用工厂函数(类名加上一对括号),和其他的 ...

  10. java多线程(二)-Runnable和Thread

    Java在顺序性语言的基础上提供了多线程的支持.Java的线程机制是抢占式的.这表示调度机制会周期的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片.(与抢占式多线程对应的是 协作式多线 ...