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 ...
随机推荐
- 这些javascript面试题,你做对了几道?
1.---------------------------------------------------- var fun = function(){ this.name = 'peter'; re ...
- 使用pngquant来压缩png资源缩小apk
最近发现了一个叫做pngquant的工具,可以有效的压缩资源文件中的png文件,从而减小发布的apk的大小.我发现这个工具有两个特点: 1. 真无损,压缩后重新运行了我的app发现是没有任何区别的 2 ...
- java并发:线程同步机制之计数器&Exechanger
第一节 CountDownLatch (1)初识CountDownLatch (2)详述CountDownLatch CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量. ...
- (译文)MVC通用仓储类
Generic Repository Pattern MVC Generic Repository Pattern MVC 原文链接:http://www.codeproject.com/Articl ...
- 用js转换joson返回数据库的时间格式为/Date(*************)/
原理是取中间的毫秒数,再转换成js的Date类型 function ChangeDateFormat(val) { if (val != null) { var date = new Date(par ...
- struct socket 结构详解
Socket数据结构网络协议CC++ 用户使用socket系统调用编写应用程序时,通过一个数字来表示一个socket,所有的操作都在该数字上进行,这个数字称为套接字描述符.在系统调用 的实现函 ...
- XMl各种格式转换功能代码
package com.cdv.test; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.File ...
- MAC中查看Python安装路径
[admin@admindeMac:~]which Python /usr/bin/Python
- Java设计模式(七) 模板模式
[模板模式]在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 1,定义模板类 package com.pattern ...
- E(X+Y), E(XY), D(X + Y)
\(X, Y\)为两个随机变量, \(p_X(x), p_Y(y)\)分别为\(X, Y\)的概率密度/质量函数, \(p(x, y)\)为它们的联合概率密度. \(E(X + Y) = E(X) + ...