COGS103&tyvj1899 [NOIP2002]矩形覆盖
题目里给的范围是k<=4,但是官方数据并没有k==4的情况,导致一些奇奇怪怪的DP写法也能过。听说标程在k==4的时候有反例,掀桌….. 难怪COGS上k==4的数据答案是错的。
还是好好写个搜索吧:网上写法很多.我是每次沿着一条平行于坐标轴的直线将点集分割成两部分,并枚举k个矩形如何在两边分配。边界为k==1,扫一遍所有点找到最小的矩形。细节看代码吧.
但是这个搜索我也不能保证是对的,因为k==4有可能出现这种崎岖的最优方案:不存在一条平行于坐标轴且不和任何一个矩形相交的直线将4个矩形分成两部分.例如这样的最优方案:

贴个代码吧:递归的时候为了处理“将点集分成两部分”调了一堆memcpy….好在递归层数和点数都不多,不然常数炸天....
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
int x[maxn],y[maxn],seq[maxn];
inline int max(int a,int b){
return a>b?a:b;
}
inline int min(int a,int b){
return a<b?a:b;
}
bool cmp1(const int &a,const int &b){
return x[a]<x[b];
}
bool cmp2(const int &a,const int &b){
return y[a]<y[b];
}
struct node{
int x1,y1,x2,y2;
node(){}
node(int a,int b,int c,int d){
x1=a;y1=b;x2=c;y2=d;
}
}sol[];int cnt=;
int work(int l,int r,int seq[]){
int minx=0x7f7f7f7f,miny=0x7f7f7f7f,maxx=,maxy=;
for(int i=l;i<=r;++i){//printf("seq%d\n",seq[i]);
minx=min(minx,x[seq[i]]);maxx=max(maxx,x[seq[i]]);
miny=min(miny,y[seq[i]]);maxy=max(maxy,y[seq[i]]);
}
sol[++cnt]=node(minx,miny,maxx,maxy);
return (maxx-minx)*(maxy-miny);
}
int s[][];int tot=;
int dfs(int l,int r,int k,int seq[]){//printf("%d\n",k);
if(k==){
int tmp=work(l,r,seq);
cnt--;
return tmp;
}else{
int ans=0x7f7f7f7f;
sort(seq+l,seq+r+,cmp1);
for(int i=l;i<r;++i){
for(int j=;j<k;++j){
++tot;
memcpy(s[tot],seq,sizeof(int)*);
++tot;
memcpy(s[tot],seq,sizeof(int)*);
if(x[seq[i]]!=x[seq[i+]]){
int tmp=dfs(l,i,j,s[tot-])+dfs(i+,r,k-j,s[tot]);
ans=min(ans,tmp);
}
--tot;--tot;
//printf("---------------\n");
}
}//printf("%d\n",ans);
sort(seq+l,seq+r+,cmp2);
for(int i=l;i<r;++i){
for(int j=;j<k;++j){
++tot;
memcpy(s[tot],seq,sizeof(int)*);
++tot;
memcpy(s[tot],seq,sizeof(int)*);
if(y[seq[i]]!=y[seq[i+]]){
int tmp=dfs(l,i,j,s[tot-])+dfs(i+,r,k-j,s[tot]);
ans=min(ans,tmp);
}
--tot;--tot;
//printf("---------------\n");
}
}//printf("%d\n",ans);
return ans;
}
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=;i<=n;++i){
scanf("%d%d",x+i,y+i);
}
for(int i=;i<=n;++i){
seq[i]=i;
}
printf("%d\n",dfs(,n,k,seq));
return ;
}
COGS103&tyvj1899 [NOIP2002]矩形覆盖的更多相关文章
- [LuoguP1034][Noip2002] 矩形覆盖
[LuoguP1034][Noip2002] 矩形覆盖(Link) 在平面上有\(N\)个点,\(N\)不超过五十, 要求将这\(N\)个点用\(K\)个矩形覆盖,\(k\)不超过\(4\),要求最小 ...
- NOIP2002矩形覆盖[几何DFS]
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- NOIP2002 矩形覆盖
题四 矩形覆盖(存盘名NOIPG4) [问题描述]: 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2), ...
- 洛谷1034 NOIP2002 矩形覆盖
问题描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7). 这些点可以 ...
- 【OpenJudge 1793】矩形覆盖
http://noi.openjudge.cn/ch0405/1793/ 好虐的一道题啊. 看数据范围,一眼状压,然后调了好长时间QwQ 很容易想到覆盖的点数作为状态,我用状态i表示至少覆盖状态i表示 ...
- bzoj 1185 旋转卡壳 最小矩形覆盖
题目大意 就是求一个最小矩形覆盖,逆时针输出其上面的点 这里可以看出,那个最小的矩形覆盖必然有一条边经过其中凸包上的两个点,另外三条边必然至少经过其中一个点,而这样的每一个点逆时针走一遍都满足单调性 ...
- [剑指OFFER] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖
跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) ...
- UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]
题意: 求矩形覆盖K次以上的面积 分析: k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次 // File Name: 11983.cpp // Author: ...
- 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1945 Solve ...
随机推荐
- c++ typeid获取类型名-rtti
typeid操作符的作用就是获取一个表达式的类型.返回结果是const type_info&.不同编译器实现的type_info class各不相同.但c++标准保证它会实现一个name()方 ...
- Qt 5.2 Creator 和 vs2012 QT 插件的安装
在QT官网下载QT http://qt-project.org/downloads 我下的是64位版本Qt 5.2.1 for Windows 64-bit vs2012插件是 Visual Stu ...
- SQL 性能调优日常积累
我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE 的解析器按照从右到左 ...
- C“中断” 与 JS“异步回调” 横向对比
在底层C语言中,有一个非常重要而特别的概念,叫做“中断”.用比喻来说,我正在写着博客,突然我妈打个电话过来,我就离开了键盘去接电话了,然后写博客就中断了,我聊完电话回来再继续写.乍一听似乎并没有什么大 ...
- ModernUI教程:使用WPF4.0
Modern UI 同时支持WPF4.0和4.5.下载包中包含了这两个版本的程序集.当你使用Nuget下载时,会根据你选择的运行时版本自动选择对应的版本下载.而Visual Studio2012的模板 ...
- WebBrowser与IE的关系,如何设置WebBrowser工作在IE9、10、11模式下?
Web Browser Control – Specifying the IE Version http://www.west-wind.com/weblog/posts/2011/May/21/We ...
- JPEG格式
Jpg文件格式[参考] 微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分.正序存放就是高字节存放在前低字节在后,而逆序存放就是低字节在前高字节在后.例如,十六 ...
- java机器学习工具包
下面是25个Java机器学习的工具&&库列表: 1. Weka 是一个数据挖掘任务机器学习算法的集合.这些算法可以直接应用于数据集或者在你自己的Java代码中调用.Weka 包含 数据 ...
- java泛型中的对象
import java.util.HashMap; class Key { String s; Key(String s) { this.s = new String(s); } @Override ...
- SpringMVC学习--异常处理器
简介 springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeExc ...