POJ 2008
这道题,说实话,细节很多。不过,我没想到,光细节就能搞死人了。。。
参考了http://www.cppblog.com/varg-vikernes/archive/2010/03/12/109559.html
首先,要把所有牛放到坐标系上来表示。目的,就是求出包含最多点的直角三角形。
直角三角形的两条直角边上都必须有点,也就是一组牛中的具有最小height的点和具有最小width的点。
直角三角形的边长也是固定的,cw = C/B,ch = C/A。这个还好说,从那个限制条件可以推出来的。初中都学过,呵呵。
Step1:求出经过一个点的所有可能存在的三角形。
其实也就是在该点下方的灰色区域中选择点来确定一个三角形。
Step2:求出经过一个点的所有可能存在的三角形中,最多包含的点数。
解法相当精妙。
求一个三角形内的点数,可以分解为一个矩形内的点数减去一个梯形内的点数。
用这个方法,求出最上面那个三角形的点数之后。可以继续递推得到下面其他三角形的点数。
也就是加上一个矩形,再减去一个梯形。
如果点按照高度排序以后,那么后面矩形里的点一定是后出现的。这样就可以做到随时增加矩形。
但是减去梯形这个操作,就难理解一点,把点按照A*H + B*W来排序,就能保证后面梯形里的点一定是后出现的。
可见,A*H + B*W 值的大小决定了他们的位置分布。完全可以保证这个顺序。
这种数形结合的方法实在是相当精妙!
在退出点的时候,我选择用优先队列来做。写得很锉
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cctype>
#include <vector>
#include <queue>
#include <algorithm>
#define LL unsigned __int64
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; const int N=; struct Node{
int x,y;
int AH;
bool operator <(const Node &a) const {
if(y>a.y) return true;
else if(y==a.y){
if(x<a.x) return true;
}
return false;
}
}node[N];
int n,A,B,C,xh,yh;
struct Int_Node{
int AH;
Int_Node(int x){AH=x;};
bool operator<(const Int_Node &a)const {
if(AH<a.AH) return true;
return false;
}
};
priority_queue<Int_Node>Q; int main(){
int ah,ans=;
while(scanf("%d",&n)!=EOF){
ans=;
scanf("%d%d%d",&A,&B,&C);
yh=C/B; xh=C/A;
for(int i=;i<n;i++){
scanf("%d%d",&node[i].x,&node[i].y);
node[i].AH=A*node[i].x+B*node[i].y;
}
sort(node,node+n);
for(int i=;i<n;i++){
int xmin=node[i].x,ymin=node[i].y;
ah=A*xmin+B*ymin;
int j;
for(j=;j<i;j++){
if(node[j].y==ymin) break;
if(node[j].x<=xmin+xh&&node[j].y<=ymin+yh&&node[j].x>=xmin)
if(A*node[j].x+B*node[j].y-ah<=C)
Q.push(Int_Node(node[j].AH));
}
for(j;j<n&&node[j].x<=xmin+xh&&node[j].y==ymin&&node[j].x>=xmin;j++)
Q.push(Int_Node(node[j].AH));
int ts=Q.size();
ans=max(ans,ts);
for(int k=j;node[k].y+yh>=node[i].y&&k<n;k++){
if(node[k].y<ymin){
ymin=node[k].y;
ah=A*xmin+B*ymin;
int p;
for(p=k;node[p].y==ymin&&p<n;p++){
if(node[p].x<=xmin+xh&&node[p].x>=xmin){
Q.push(Int_Node(node[p].AH));
}
}
k=p-;int tmp;
while(!Q.empty()){
tmp=Q.top().AH;
if(tmp-ah>C){
Q.pop();
}
else
break;
}
ts=Q.size();
ans=max(ans,ts);
}
}
while(!Q.empty())
Q.pop();
}
printf("%d\n",ans);
}
return ;
}
POJ 2008的更多相关文章
- POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)
POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...
- HDU 2494/POJ 3930 Elevator(模拟)(2008 Asia Regional Beijing)
Description Too worrying about the house price bubble, poor Mike sold his house and rent an apartmen ...
- POJ 1511 Invitation Cards (ZOJ 2008) 使用优先队列的dijkstra
传送门: http://poj.org/problem?id=1511 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1008 ...
- POJ 3608 Bridge Across Islands --凸包间距离,旋转卡壳
题意: 给你两个凸包,求其最短距离. 解法: POJ 我真的是弄不懂了,也不说一声点就是按顺时针给出的,不用调整点顺序. 还是说数据水了,没出乱给点或给逆时针点的数据呢..我直接默认顺时针给的点居然A ...
- POJ 3322(广搜)
---恢复内容开始--- http://poj.org/problem?id=3322 题意:http://jandan.net/2008/01/24/bloxorz.html就是这个鬼游戏 我也是郁 ...
- (转)POJ题目分类
初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. ...
- poj分类
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- [双连通分量] POJ 3694 Network
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9434 Accepted: 3511 Descripti ...
- Poj(3686),最小权匹配,多重匹配,KM
题目链接 The Windy's | Time Limit: 5000MS | Memory Limit: 65536K | | Total Submissions: 4939 | Accepted: ...
随机推荐
- [python 基础]python装饰器(二)带参数的装饰器以及inspect.getcallargs分析
带参数的装饰器理解无非记住两点: 1.本质不过在基本的装饰器外面再封装一层带参数的函数 2.在使用装饰器语法糖的时候与普通装饰器不同,必须要加()调用,且()内的内容可以省略(当省略时,admin默认 ...
- [NOI2018]归程(80pts)
https://www.zybuluo.com/ysner/note/1219964 题面 题面太长,难以概述,[戳我][1] \(ex10pts\ tree\) \(50pts\ n\leq1500 ...
- E20170907-ts
flash vt. 使闪光,使闪烁; 拍出,发出(电报等); 〈口〉炫耀; adj. 闪光的,闪耀的,一闪而过的; 浮华的; 庞大的; n. 闪光; 闪光灯下摄 ...
- Django day04 路由控制
Django请求的整个的生命周期 Django中路由控制的作用: 一: 简单配置 url 是一个函数 -第一个参数是正则表达式(如果要精确匹配:'^publish'/$ 以^开头,以$结尾) -第二个 ...
- 【POJ2248、LOJ#10021】 Addition Chains
事先预警:由于我太蒻了,本做法只能在POJ.LOJ等小数据(N<=100)平台上通过,在UVa(洛谷)上大数据并不能通过 戳我获得更好的观看效果 本题不用看,爆搜就是了,但是纯爆搜显然会爆时间, ...
- BZOJ 4517 组合数+错排
思路: 预处理错排 然后C(n,m)*s[n-m-1]就是答案了 特判n-m-1<0 //By SiriusRen #include <cstdio> using namespace ...
- AFN上传多张图片
AFN上传多张图片代码: AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager]; sessionManager.r ...
- Safe Area Layout Guide before iOS 9.0
今天使用Xcode9.1重建项目,什么都没写运行报错:Safe Area Layout Guide before iOS 9.0!目前为止,不晓得原因,现记录解决方法:
- DeltaFish 校园物资共享平台 第二次小组会议
软工第二周小组会议 会议地点:三教讨论区 会议时间:9:00 ~ 10:00 与会人员:软工小组成员 请假人员:刘鼎乾 整理人:艾寅中 会议记录 一.小组分工 在经过一周的调研后,组长根据调研结果和对 ...
- 【转载】linux环境下大数据网站搬家
这里说的大数据是指你的网站数据库大小至少超过了500M,当然只有50M的网站也同样可以用这样的方法来轻松安全的实现网站搬家,前提是你使用的是linux环境下的VPS或者独立服务器. 我们假设你的网站域 ...