poj2008

题意:给定一些点的坐标(hi,wi),要选出一个点集,使得集合所包含的点数最多,且符合A*(H-h) + B*(W-w) <= C,h为集合中最小h,w为点集中最小w。

分析:我们是要找到这样的点集,hi>=h,wi>=w,A*(hi-h) + B*(wi-w) <= C。根据线性规划知识,这些点都在一个直角三角形内,两条直角边长度为cw=C/A,ch=C/B。我们的问题转化为用这样一个三角形最多能框住多少点,且根据题意w,h为点集坐标最小值,即三角形两条直角边上都要有点。

我们的做法是,枚举n个点,对于每个点,先使其处于三角形的直角顶点(左下角),然后向下平移三角形框,每次多加进一个点且要保证我们本次枚举的那个点不出框。看最多的时候能有多少个点在框内。每向下推一下要加进哪些点,除去哪些点我们用一个巧妙的方法来处理。我们用跨越三角形底边的点数减去跨域三角形斜边的点数。我们利用一个将所有点按高度排序的数组,和一个指向该数组的指针,每次枚举一个点,就把指针指向第一位(默认所有点都在线框底边以下),每推一下,就将指针向后移动一些,看有几个点由线框底边以下变为以上。同理我们需要一个按k=A*hi  + B*wi排序的数组。用相同的方法来统计有多少点跨域了斜边。注意不是所有指针掠过的点都是跨越的,需要判断他们的横坐标是否在范围内。

ContractedBlock.gifExpandedBlockStart.gifView Code
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

#define maxn 1005

struct Point
{
int w, h, k;
}point[maxn], *sort_h[maxn], *sort_k[maxn];

int n, cw, ch, A, B, C;
int ans, cnt, hnum, knum;

bool cmph(Point *a, Point *b)
{
return a->h > b->h;
}

bool cmpk(Point *a, Point *b)
{
return a->k > b->k;
}

void input()
{
scanf("%d", &n);
scanf("%d%d%d", &A, &B, &C);
ch = C / A;
cw = C / B;
for (int i = 0; i < n; i++)
{
scanf("%d%d", &point[i].h, &point[i].w);
point[i].k = A * point[i].h + B * point[i].w;
sort_h[i] = &point[i];
sort_k[i] = &point[i];
}
}

int cal(int h, int w)
{
for (; hnum < n && sort_h[hnum]->h >= h; hnum++)
if (sort_h[hnum]->w >= w && sort_h[hnum]->w <= w + cw)
cnt++;
int k = A * h + B * w + C;
for (; knum < n && sort_k[knum]->k > k; knum++)
if (sort_k[knum]->w >= w && sort_k[knum]->w <= w + cw)
cnt--;
return cnt;
}

void work(int a)
{
cnt = hnum = knum = 0;
int w = sort_h[a]->w;
int h = sort_h[a]->h;
for (int i = a; i < n && sort_h[i]->h >= h - ch; i++)
if (sort_h[i]->w >= w && sort_h[i]->w <= w + cw)
ans = max(ans, cal(sort_h[i]->h, w));
}

int main()
{
//freopen("t.txt", "r", stdin);
input();
sort(sort_h, sort_h + n, cmph);
sort(sort_k, sort_k + n, cmpk);
ans = 0;
for (int i = 0; i < n; i++)
work(i);
printf("%d\n", ans);
return 0;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git右键没有Git Bash Here的解决办法

好长一段时间没有使用Git了&#xff0c;今天想用git在码云上下载东西&#xff0c;但是突然发现右键没有Git Bash Here了&#xff0c;然后在网上搜索了一番&#xff0c;然后解决了。 解决方法&#xff1a; winR 打开运行小窗口&#xff0c;在 “ 运行 ” 中输入‘ regedit ’&…

随想系列_4_从电影《可可西里》说起

今天&#xff0c;国庆节的第一天&#xff0c;感觉不到放假的轻松&#xff0c;反而更加觉得心情沉闷。 无聊&#xff0c;生活的主旋律&#xff0c;一直如此&#xff1b;死气沉沉&#xff0c;感觉不到活力&#xff1b;每天做的事空泛而无趣&#xff1b;没有任何意义&#xff0c;没…

对可重入锁和不可重入锁的理解

可重入锁&#xff1a;ReentrantLock 在学JUC的时候&#xff0c;听到可重入锁这个词&#xff0c;不理解它的概念&#xff0c;网上搜索一番&#xff0c;还是有点迷糊&#xff0c;所以自己再来做一下笔记&#xff0c;理一理思路。 一、锁是什么&#xff1f; 我们这里提到的锁&am…

Windows Phone 7开发一月谈(3)

如何获知手机与PC相连Spb Shell 技术研究windows mobile 6.0 C# 如何获得 SIM卡 ICCID &#xff1f;mobile上如何掉用API来挂掉电话关于全屏程序下输入法的显示问个获取主机IP地址的问题&#xff1f;在设置-电话界面中铃声播放问题怎样获取TAPI的LINECALLSTATE_RINGBACK消息Dir…

Synchronized 和 Lock 区别

Synchronized 和 Lock 区别 Synchronized 是内置的Java关键字&#xff0c; Lock 是一个Java类Synchronized 无法判断获取锁的状态&#xff0c;Lock 可以判断是否获取到了锁Synchronized 会自动释放锁&#xff0c;lock 必须要手动释放锁&#xff01;如果不释放锁&#xff0c;会…

对HashMap数据结构的理解——加载因子和初始容量

先看源码&#xff1a; 解释一下位移运算&#xff1a; 1<<4 是位移运算的表示&#xff0c;为十进制16 1的二进制表示&#xff1a;1 左移4位之后的二进制表示为B&#xff08;10000&#xff09; D&#xff08;16&#xff09; 更简单的计算方法就是 1<< n 等效于 1 乘…

objective-c 使用NSNumber 将int float long等数据类型加入到数组或字典中

objective-c 使用NSNumber 将int float long等数据类型加入到数组或字典中设置值和取值如下代码&#xff1a;NSNumber *number[NSNumber numberWithInt:45]; NSLog("NSNumber %d",[number intValue]);

远程服务器电脑的设置

1、因为我要远程的电脑已经被人家设置过了远程了&#xff0c;而他已经将远程的端口改为4816&#xff0c;所以我一直以为是3389端口&#xff0c;上网搜索了很久都没有发现什么问题出现在哪&#xff1f;命令环境下查看端口状态都还是关着的&#xff0c;没有打开&#xff0c;远程一…

巧用加密方法保障电子邮件系统安全

近几年来&#xff0c;针对公司的间谍活动越来越严重。因此部署某种加密系统以确保窥探者不能从其截获的消息中破译什么内容&#xff0c;或者不能因为电脑被窃取而丢失信息是非常有意义的。不管是客户的数据&#xff0c;雇员数据&#xff0c;知识产权还是财务信息&#xff0c;丢…

“习惯性思维”引起的血案

好久没有更新了&#xff0c;一客户因为IT规划问题&#xff0c;需要将Citrix服务器迁到新的域&#xff0c;Citrix服 务器需要重新配置。但是当我重新配置完站点后&#xff0c;发现无论如何都登录不了。 错误截图&#xff1a; 我按照传统的思路来解决问题&#xff0c; 1、查看服务…

折腾中兴V880

一、验屏&#xff1a;输入*983*0#&#xff0c;选择LCD&#xff0c;按返回键换色&#xff0c;即可检验。二、Root。1、先设置手机为USB调试模式&#xff0c;设置方法&#xff1a;menu——设置——应用程序——开发&#xff0c;打开“USB”调试和“保持唤醒状态”下载豌豆荚&…

剑指 Offer 32 . 从上到下打印二叉树

main函数测试代码&#xff1a; 按标准输入输出&#xff0c;比如输入&#xff1a; 3,9,20,null,null,15,7 public static void main(String[] args) {//输入3,9,20,null,null,15,7Scanner sc new Scanner(System.in);String s sc.nextLine();String[] split s.split(",…

HTTP 头部解释

HTTP&#xff08;HyperTextTransferProtocol&#xff09;是超文本传输协议的缩写&#xff0c;它用于传送WWW方式的数据&#xff0c;关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求&#xff0c;请求头包含请求的方法、URI、协议…

剑指 Offer 52. 两个链表的第一个公共节点

剑指 Offer 52. 两个链表的第一个公共节点 输入两个链表&#xff0c;找出它们的第一个公共节点。 思想&#xff1a;双指针法&#xff0c;浪漫相遇 public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode pointA headA;ListNode pointB he…

Android 创世纪 第二天

第二天&#xff0c;google说&#xff0c;荒芜要被开垦&#xff0c;系统便运作了&#xff0c;它是linux。 --xxx 荒蛮大地就要变得肥沃&#xff0c;linux已经运行起来了。。。。 linux就不多讲了&#xff0c;这里只讲讲被google大刀阔斧改了内核后的linux。 第一天最后&#xff…

“.NET研究”谈谈C# 4.0新特性“缺省参数”的实现

C#4.0关于缺省参数的新特性&#xff0c;相信大家都不会陌生。所谓缺省参数&#xff0c;顾名思义&#xff0c;就是在声明方法的某个参数的时候为之指定一个默认值&#xff0c;在调用该方法的时候如果采用该默认值&#xff0c;你就无须指定该参数。和很多语言层面特性&#xff08…

IDEA查看源码时总是出现.class而不是.java源码(解决办法)

自己安装的JDK8里面就有源码&#xff0c;就是图中的src.zip&#xff0c;我还傻乎乎的跑去下。 我参考下面这个链接解决了这个问题&#xff1a; https://www.it610.com/article/1283023085871579136.htm 特别注意其中的一句话&#xff1a;把SDKs中多余的jdk删掉留一个就好&am…

ASP“.NET研究”.NET中的认证与授权

用户认证 .net提供了3种用户认证的方式&#xff0c;分别是Windows,Forms&#xff0c;Passport。这几种形式的定义可以在网站根目录下Web.config中的authentication节点中看见。Windows是默认的验证形式&#xff0c;它是根据机器的访问权限来判断的。Passport是微软提供的一种验…

针对资源管理器文件夹右键一直转圈圈卡死的问题

问题描述 每次打开资源管理器&#xff0c;文件夹右键就会一直转圈圈&#xff0c;转到资源管理器自动退出 解决方法 网上试了很多种方法&#xff0c;都没有解决我的问题&#xff0c;偶然在运行菜单里看到两个根本不是我装的疑似携带病毒类的软件&#xff0c;把他们都卸载之后…

用NuGet掌管你的Vi“.NET研究”sual Studio扩展

如果你使用Visual Studio 2010&#xff0c;那么 NuGet 可以使你的生活更加美好。当你项目里要引用到的一些库时候&#xff0c;比如JQuery 库或者 NHibernate, NUnit, log4net 你就可以考虑使用NuGet。它可以辅助你安装或者更新这些库。 当然我不得不继续说下去从安装到使用&…