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. oracle聚合函数avg()注意点

    avg:用avg函数进行平均运算时会忽略空值(即最终出现的平均值不对[如果原始数据中存在空值的话]),可以这样子来解决:avg(nvl(comm,0))或者sum(comm)/count(*)---- ...

  2. ! Unknown property attribute "class"

    当时是在用Xcode 7进行编译ASDK的代码发现报错了 当时就蒙圈了,@property(class)--这是啥呀,太久没看过object-c了,但是不至于@property是没有class属性的, ...

  3. echarts绘制饼图时的一点特殊设置

    最后的效果如图,需要在中间展示的部分换行然后字体大小不同. 以下为option的设置,使用rich里面的参数来设置更多的文本样式,使用‘\n’来控制换行 let option = { color: c ...

  4. PHP 换行处理

    换行符 unix系列用 \n windows系列用 \r\n mac用 \r PHP中可以用PHP_EOL来替代,以提高代码的源代码级可移植性 如: <?php echo PHP_EOL; // ...

  5. Windows-右键菜单添加选项

    新建 add.reg 输入选项名和选项对应程序路径 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\选项名] [HKEY ...

  6. 【SQL】链接服务器

    最近做项目,需要对两个数据库进行同步操作,所以采用在Server SQL中建立链接服务器方式实现. 链接服务器,可以直接访问/操作其他服务器上的数据库表. 1.连接SQL Server链接服务器 EX ...

  7. java中子类继承父类程序执行顺序

    java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...

  8. HDU 3746 Cyclic Nacklace (KMP找循环节)

    题目链接:HDU 3746 Sample Input 3 aaa abca abcde Sample Output 0 2 5 Author possessor WC Source HDU 3rd & ...

  9. 在不打开excel的情况下用python执行excel

    import win32com.client import time path = r'absolute dir' #比如填文件的绝对路径,比如d:/file/stock.xlsx xl = win3 ...

  10. Source object main.o has EABI version 0, but target ../../../bin/ad has EABI version 5

    编译的时候,遇到了一些问题:Source object main.o has EABI version 0, but target ../../../bin/ad has EABI version 5 ...