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 ...
随机推荐
- 简单的js验证码
转自:未找到 <script type ="text/javascript" language ="javascript"> var cod ...
- UDP的坏处
众所周知,UDP是一个面向无连接的协议.通信时不可靠的.这就会出现一些问题 (1)数据报丢失 因为是无连接,的所以可以用recvfrom和sendto来接收和发送消息,如果socket是阻塞的,那么当 ...
- spring:如何用代码动态向容器中添加或移除Bean ?
先来看一张类图: 有一个业务接口IFoo,提供了二个实现类:FooA及FooB,默认情况下,FooA使用@Component由Spring自动装配,如果出于某种原因,在运行时需要将IFoo的实现,则F ...
- 利用Weblogic的iisproxy、iisforward插件实现IIS转发
默认情况下,IIS只能提供http重定向功能,而无法满足转发需求. 举例:http://localhost/app1 利用http重定向到 http://www.abc.com/app1 访问 htt ...
- MVC5 + EF6 + Bootstrap3 (15) 应用ModelState和Data Annotation做服务器端数据验证
Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-server-side-validation.html 系列 ...
- 二:【nopcommerce系列】Nop的文件结构,引用关系。如何编译打包部署等
如果,你还没先看第一篇,先看看 一:[nopcommerce系列]Nop整体架构的简单介绍,在看nop代码之前,你需要懂哪些东西 如果你确定你已经看完了第一篇,并且真的理解 mvc.和autofac, ...
- 为 Xamarin.Forms 做个跑马灯控件
前段时间,私下用 Xamarin.Forms 做了个商业项目的演示版.很多被国内App玩坏了的控件/效果,XF上都没有或是找不到对应的实现,没有办法只能亲自上阵写了几个,效果还行,就是有BUG. 这个 ...
- ajax请求加载Loading或错误提示
<div id="loadingDiv" style="color:#f39800;">Loading...</div> <scr ...
- dinic模板
procedure addedge(u,v,cap:longint); begin sid[tot].u:=u; sid[tot].v:=v; sid[tot].cap:=cap; sid[tot]. ...
- C# winform多线程的小例子
在文本框中输入一个数字,点击开始累加按钮,程序计算从1开始累计到该数字的结果.因为该累加过程比较耗时,如果直接在UI线程中进行,那么当前窗口将出现假死.为了有更好的用户体验,程序启动一个新的线程来单独 ...