P1493 分梨子

题目描述

Finley家的院子里有棵梨树,最近收获了许多梨子。于是,Finley决定挑出一些梨子,分给幼稚园的宝宝们。可是梨子大小味道都不太一样,一定要尽量挑选那些差不多的梨子分给孩子们,那些分到小梨子的宝宝才不会哭闹。

每个梨子都具有两个属性值,Ai和Bi,本别表示梨子的大小和甜度情况。假设在选出的梨子中,两个属性的最小值分别是A0和B0。只要对于所有被选出的梨子i,都满足C1*(Ai-A0)+C2*(Bi-B0)≤C3(其中,C1、C2和C3都是已知的常数),就可以认为这些梨子是相差不多的,可以用来分给小朋友们。

那么,作为幼稚园园长的你,能算出最多可以挑选出多少个梨子吗?

输入输出格式

输入格式:

第一行一个整数N(1≤N≤2000),表示梨子的总个数。

第二行三个正整数,依次为C1,C2和C3(C1,C2≤2000,C3≤10^9)。

接下来的N行,每行两个整数。第i行的两个整数依次为Ai和Bi。

输出格式:

只有一个整数,表示最多可以选出的梨子个数。

输入输出样例

输入样例#1:

3
2 3 6
3 2
1 1
2 1
输出样例#1:

2

说明

各个测试点2s

样例说明:可以选择1、3两个梨子或者2、3两个梨子。

分析:

反正蒟蒻没推出dp式子,但是把不等式化一化,然后弄个排序暴力模拟均摊N^2的效率跑过去了。

简单的讲一件怎么搞吧。

首先根据题意:c1*(ai-a0)+c2*(bi-b0)<=c3

---->c1*ai+c2*bi-c3<=c1*a0+c2*b0

显然,不等式的左边是关于i的一个常数,弄个数组d先保存好。然后我们来看看怎么处理右边。

我们常规的思路就是:枚举a0,b0(n^2),然后再暴力统计一下(n),总的O(n^3),我们借鉴一下单调队列优化dp的思路,考虑直接枚举a0,但是把b0排序好,然后按某种方式统计,看看能否提高效率。

先从理论上分析是否有提高的可能性:首先d数组必须要排序,由于d数组的单调不下降性,所以b0枚举如果是有序的,那么是可以节省一些时间的!

再来仔细分析一下怎么来优化:我们先一层循环枚举a0,然后一层循环枚举b0,然后一层循环在d数组统计答案

显然,如果我们枚举到一个a0[i],b0[j],当枚举到d[k]时,不等式不成立了,那么另一句话就是从1...k-1不等式都是成立的,那么我们计算b0[j+1]的结果时,只有在原b数组中1....k-1中大于b0[j+1]的数字是不合法的,然后直接从k到n继续判断d[k]是否能使不等式成立就行了,

这时就是一个类似单调队列优化dp的过程了!

先给一段伪代码:

for i=1 to n

for j=1 to n

  for k=k to n

第三层循环的k是不下降的,所以最多只会在j的循环下枚举n次(均摊意义),所以总的就是O(n*n)的了!

那么如何维护一下1....k-1中大于某个数的数字个数呢?

想到逆序对没有?对呀,树状数组不就好了?

不过更巧妙的,由于我们这里有了一层循环,并且b0的枚举是有序的,我们直接开个桶,累计每个数字使用的次数,然后累加时把小于当前数字桶中的全减掉,然后把那个数字的桶清空,防止重复减就行了!

当然,想不到桶的做法也是没有关系的,毕竟n只有2000,用树状数组logn=11,那么就是2000*2000*11=4.4*10^7。还是可以过的哟

(^U^)ノ~YO

参考代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=;
struct Pear{
int v,idx;
bool operator < (const Pear &rhs) const{
return v<rhs.v;
}
Pear(int v=,int idx=):v(v),idx(idx){}
}c[N],d[N];
int a[N],b[N],sum[N];
int n,c1,c2,c3;
int main(){
scanf("%d%d%d%d",&n,&c1,&c2,&c3);
//c1*(ai-a0)+c2*(bi-b0)<=c3
//c1*ai+c2*bi-c3<=c1*a0+c2*b0
for (int i=;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
c[i]=Pear(b[i],i);
d[i]=Pear(a[i]*c1+b[i]*c2-c3,i);
}
sort(c+,c+n+);sort(d+,d+n+);
int res=;
for (int i=,ans=;i<=n;i++,ans=){
memset(sum,,sizeof(sum));
for (int j=,k=;j<=n;j++){
for (;k<=n && d[k].v<=c1*a[i]+c2*c[j].v;k++){
if (a[d[k].idx]>=a[i] && b[d[k].idx]>=c[j].v){
ans++;
sum[b[d[k].idx]]++;
}
}
ans-=sum[c[j-].v];
sum[c[j-].v]=;
res=max(res,ans);
}
}
printf("%d",res);
return ;
}

P1493 分梨子的更多相关文章

  1. vijos 分梨子

    点击打开题目 很有(wei)趣(suo)的一道题 暴力解法也不难,枚举大小下限与甜度下限,在一个一个地试 显然 O(n^3) 炸掉 但如何将其缩短,只好从那个式子来入手了: C1⋅(ai−a0)+C2 ...

  2. [SinGuLaRiTy] 2017-07-21 综合性测试

    [SinGuLaRiTy-1028] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 对于所有题目:Time Limit: 1s | Memo ...

  3. [SinGuLaRiTy] 动态规划题目复习

    [SinGuLaRiTy-1026] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [UVA 1025] A Spy in the Metr ...

  4. 分治法求解最近对问题(c++)

    #include"stdafx.h" #include<iostream> #include<cmath> #define TRUE 1 #define F ...

  5. Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法

    本文源于一次课题作业,部分自己写的,部分借用了网上的demo 牛顿迭代法(1) x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);gr ...

  6. CRL快速开发框架系列教程十一(大数据分库分表解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. WebGIS项目中利用mysql控制点库进行千万条数据坐标转换时的分表分区优化方案

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目中有1000万条历史案卷,为某地方坐标系数据,我们的真实 ...

  8. arcgis api for js入门开发系列六地图分屏对比(含源代码)

    上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...

  9. 分享一个MySQL分库分表备份脚本(原)

    分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...

随机推荐

  1. 科学把妹法 ( ̄▽ ̄)"

    曾经有一位生物学人士,公布了工科把妹第一弹,暨“巴甫洛夫把妹法”: 每天给你那位心仪的女同事/女同学的抽屉里都放上精心准备的早餐,并且保持缄默不语,无论她如何询问,都不要说话.  如此坚持一至两个月, ...

  2. H5+SDK

    1.(个人猜测): SDK是写在容器(手机操作系统上的webview组件)上的应用,对H5应用暴露规定的API接口.相当于浏览器的开发者,给浏览器中新增了某些方法,js直接通过接口就可以调用的. 这个 ...

  3. jQuery插件之——弹窗框(模态框)leanModal

    1.首先在网上下载jquery.leanModal.min.js,添加到你的页面参考网址:https://blog.csdn.net/NTDDLIN... LeanModal.js下载地址: http ...

  4. python基础二(基本数据类型)

    python的基本数据类型:数字.字符串.列表.元祖.字典.集合 一.基本数据类型 1.1 数字int 数字主要是用来计算用的,使用方法并不多. # bit_length() 当十进制用二进制表示的时 ...

  5. 弹出框中的AJAX分页

    $(function() { $("body").on("click",".set-topic",function(){ /*获取所有题目接 ...

  6. MySQL配置(二)

    上篇文章简单的讲了一下MySQL的配置,这章我在具体讲述一下我所配置的一些内容. 一.密码策略        MySQL5.7默认安装了密码安全检查的插件.默认密码检查策略要求密码必须包含:大小写字母 ...

  7. 泛微oa系统com.eweaver.base.DataAction文件sql参数sql注入

    URL/ServiceAction/com.eweaver.base.DataAction?sql=select%201,2,3,4,5,6,7,8,9,233%20from%20DUAL%20

  8. PAT甲级——A1151 LCA_in_a_BinaryTree【30】

    The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...

  9. 13.JMeter 参数化、检查点、集合点

    参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...

  10. PHP中输出字符串(echo,print,printf,print_r和var_dump)的区别【转载】

    php中常见的输出语句 echo()可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用. prin ...