LA 3695 部分枚举
运用部分枚举的思想,很明显完全枚举点的思想是不可能的。改为枚举上下边界,当确定右边界j后,对左边界i,可以有点数为on[j]+on[i]+(leftu[j]-leftu[i])+leftd[j]-leftd[i]。然后取最大值,on[j]+on[i]+(leftu[j]-leftu[i])+leftd[j]-leftd[i]=(on[j]+leftu[j]+leftd[j])+on[i]-leftu[i]-leftd[i]。维护on[i]-leftu[i]-leftd[i]的最大值。leftu为上边界左该点左边的点数,leftd是下边界的。
注意竖线与横线交点处是否有点。所以维护最大值时应改为on[i]-leftu[i-1]-leftd[i-1];
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std; struct Point{
int x,y;
}P[105];
int y[105],leftu[105],leftd[105],onu[105],ond[105],on[105]; bool cmp(Point a,Point b){
if(a.x<b.x) return true;
return false;
} int gao(int n){
sort(P,P+n,cmp);
sort(y,y+n);
int m=unique(y,y+n)-y;
if(m<=2) return n;
int colk=0;
int res=0;
for(int i=0;i<m;i++){
for(int j=i+1;j<m;j++){
colk=0;
for(int k=0;k<105;k++){
leftu[k]=leftd[k]=on[k]=onu[k]=ond[k]=0;
}
for(int k=0;k<n;k++){
if(colk==0||P[k].x!=P[k-1].x){
on[colk]=onu[colk]-ond[colk]; colk++;
leftu[colk]+=leftu[colk-1];
leftd[colk]+=leftd[colk-1];
}
if(P[k].y==y[j]) leftu[colk]++;
else if(P[k].y==y[i]) leftd[colk]++;
if(P[k].y<=y[i]) ond[colk]++;
if(P[k].y<y[j]) onu[colk]++;
}
on[colk]=onu[colk]-ond[colk]; if(colk<=2) return n;
int tmpmax=on[1]-leftu[0]-leftd[0];
for(int k=2;k<=colk;k++){
res=max(res,on[k]+leftu[k]+leftd[k]+tmpmax);
tmpmax=max(tmpmax,on[k]-leftu[k-1]-leftd[k-1]);
}
} }
return res;
} int main(){
int kase=0,n;
while(scanf("%d",&n),n){
for(int i=0;i<n;i++){
scanf("%d%d",&P[i].x,&P[i].y);
y[i]=P[i].y;
}
int ans=gao(n);
printf("Case %d: %d\n",++kase,ans);
}
return 0;
}
LA 3695 部分枚举的更多相关文章
- LA 3695 Distant Galaxy
给出n个点的坐标(坐标均为正数),求最多有多少点能同在一个矩形的边界上. 题解里是构造了这样的几个数组,图中表示的很明白了. 首先枚举两条水平线,然后left[i]表示竖线i左边位于水平线上的点,on ...
- UVa LA 3695 - Distant Galaxy 前缀和,状态拆分,动态规划 难度: 2
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- LA 7049 Galaxy 枚举
题意: \(x\)轴上有\(n\)个质量为\(1\)的点,他们的坐标分别为\(x_i\). 质心的坐标为\(\frac{\sum{x_i}} {n}\) 转动惯量为\(\sum{d_i^2}\),其中 ...
- LA 2402 (枚举) Fishnet
题意: 正方形四个边界上分别有n个点,将其划分为(n+1)2个四边形,求四边形面积的最大值. 分析: 因为n的规模很小,所以可以二重循环枚举求最大值. 求直线(a, 0) (b, 0) 和直线(0, ...
- LA 4253 箭术(二分枚举)
https://vjudge.net/problem/UVALive-4253 题意: 有n个平行于x轴的线段,每条线段代表一个靶子.判断是否可以站在x轴上[0,W]区间内的某个位置射箭. 思路:二分 ...
- LA 4794 状态DP+子集枚举
状态压缩DP,把切割出的面积做状态压缩,统计出某状态下面积和. 设f(x,y,S)为在状态为S下在矩形x,y是否存在可能划分出S包含的面积.若S0是S的子集,对矩形x,y横切中竖切,对竖切若f(x,k ...
- LA 3887 - Slim Span 枚举+MST
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- LA 3602 - DNA Consensus String 枚举
原题地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- LA 3602 DNA Consensus String (暴力枚举)
题意:给定m个长度为n的DNA序列,求一个最短的DNA序列,使得总Hamming距离最小. Hamming距离等于字符不同的位置个数. 析:看到这个题,我的第一感觉是算时间复杂度,好小,没事,完全可以 ...
随机推荐
- 关于网页的自适应问题一---Media Query(媒介查询)
1.Media Query(媒介查询) 通过不同的媒介类型和条件定义样式表规则.媒介查询让CSS可以更精确作用于不同的媒介类型和同一媒介的不同条件.媒介查询的大部分媒介特性都接受min和max用于表达 ...
- [转]sed常用命令总结
转自:http://blog.chinaunix.net/uid-26963748-id-3249732.html 一.Sed简介 Sed:Stream Editor 流式编辑器 又称行编辑器,每次 ...
- [转]Oracle11g链接提示未“在本地计算机注册“OraOLEDB.Oracle”解决方法
本文转自:http://www.cnblogs.com/tomfang/archive/2013/05/25/3098454.html 当 用,Provider=OraOLEDB.Oracle方式访问 ...
- eclipse 安装svn插件记录
每个人都有自己喜欢的和习惯的一套开发环境,其中对于喜欢用eclipse的同学来说.subclipse插件可以说是必不可少的插件了. 他的安装有两种方法,一种是在线安装.然而这种安装实在是太慢了,无法忍 ...
- Android开发初体验
本文通过开发一个应用来学习Android基本概念及构成应用的UI组件. 开发的应用名叫GeoQuiz,它能给出一道道地理知识问题.用户点击true或false按钮回答问题,应用即时做出反馈 第一步请先 ...
- Android项目实战_手机安全卫士流量统计
## 1.抽屉控件SlidingDrawer:一定要配置android:handle(把手)和android:content(内容),并在子View中添加把手和内容的布局```java <Sli ...
- html5——网络状态
我们可以通过window.onLine来检测,用户当前的网络状况,返回一个布尔值 window.addEventListener("online",function(){ aler ...
- CSS——padding
padding是盒子内容与边框的距离. padding:10px;/*上下左右都是10px*/ padding:10px 20px;/*上下是10px 左右是20px*/ padding:10px 2 ...
- Detectron-MaskRCnn: 用于抠图的FCNN
市面上暂时还没有找到可以在消费机显卡上实时运行的MaskRCnn,TensorFlow即使是C++版本训练在coco数据集上的模型也是慢的要死,最后不堪忍受,只能放弃. 经历了一些列fuckingDo ...
- python web 开发学习路线
转载,备着 自己目前学习python web 开发, 经过两个月的摸索,目前对web开发有了浅显的认识,把自己的学习过程贴出来.1.python入门推荐老齐<从零开始学python>,&l ...