cogs103&tyvj1899[noip2002]矩形覆盖

liu_runda liu_runda     2022-08-09     804

关键词:

题目里给的范围是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=55;
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[10];int cnt=0;
int work(int l,int r,int seq[]){
    int minx=0x7f7f7f7f,miny=0x7f7f7f7f,maxx=0,maxy=0;
    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[1000][55];int tot=0;
int dfs(int l,int r,int k,int seq[]){//printf("%d\n",k);
    if(k==1){
        int tmp=work(l,r,seq);
        cnt--;
        return tmp;
    }else{
        int ans=0x7f7f7f7f;
        sort(seq+l,seq+r+1,cmp1);
        for(int i=l;i<r;++i){
            for(int j=1;j<k;++j){
                ++tot;
                memcpy(s[tot],seq,sizeof(int)*55);
                ++tot;
                memcpy(s[tot],seq,sizeof(int)*55);
                if(x[seq[i]]!=x[seq[i+1]]){
                    int tmp=dfs(l,i,j,s[tot-1])+dfs(i+1,r,k-j,s[tot]);
                    ans=min(ans,tmp);
                }
                --tot;--tot;
                //printf("---------------\n");
            }
        }//printf("%d\n",ans);
        sort(seq+l,seq+r+1,cmp2);
        for(int i=l;i<r;++i){
            for(int j=1;j<k;++j){
                ++tot;
                memcpy(s[tot],seq,sizeof(int)*55);
                ++tot;
                memcpy(s[tot],seq,sizeof(int)*55);
                if(y[seq[i]]!=y[seq[i+1]]){
                    int tmp=dfs(l,i,j,s[tot-1])+dfs(i+1,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=1;i<=n;++i){
        scanf("%d%d",x+i,y+i);
    }
    for(int i=1;i<=n;++i){
        seq[i]=i;
    }
    printf("%d\n",dfs(1,n,k,seq));
    return 0;
}

 

cogs——t1175.[顾研noip]旅游电车

http://www.cogs.pro/cogs/problem/problem.php?pid=1175★★☆  输入文件:buss.in  输出文件:buss.out   简单对比时间限制:1s  内存限制:256MB【问题描述】Henryy国正致力于首都的一个旅游电车建设工程。首都有... 查看详情

cogs466.[noip2009]细胞分裂

466.[NOIP2009]细胞分裂★★  输入文件:cell.in  输出文件:cell.out   简单对比时间限制:1s  内存限制:128MB【问题描述】    Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家。现在,他... 查看详情

cogs——t1265.[noip2012]同余方程

http://cogs.pro/cogs/problem/problem.php?pid=1265★☆  输入文件:mod.in  输出文件:mod.out   简单对比时间限制:1s  内存限制:128MB【题目描述】求关于x的同余方程ax≡1(modb)的最小正整数解。【输入格式... 查看详情

cogs983.[noip2003]数字游戏

983.[NOIP2003]数字游戏★☆  输入文件:numgame.in  输出文件:numgame.out   简单对比时间限制:1s  内存限制:128MB题目描述丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多... 查看详情

cogs1811.[noip2014]螺旋矩阵

★  输入文件:matrixc.in  输出文件:matrixc.out   简单对比时间限制:1s  内存限制:256MB【题目描述】 MLE:#include<iostream>#include<cstdio>#include<algorithm>usingn 查看详情

ac日记——[noip2015]运输计划cogs2109

[NOIP2015]运输计划 思路:  树剖+二分; 代码:#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;#definemaxn300005#defineINF0x7fffffffintn,deep[m 查看详情

cogs2104.[noip2015]神奇的幻方

★  输入文件:2015magic.in  输出文件:2015magic.out  简单对比时间限制:1s  内存限制:256MB1#include<iostream>2#include<cstdio>3inta[41][41];4intmain()5{6freopen("2015magic.i 查看详情

cogs2104.[noip2015]神奇的幻方

★  输入文件:2015magic.in  输出文件:2015magic.out   简单对比时间限制:1s  内存限制:256MB 模拟一开始数组开小了。。屠龙宝刀点击就送#include<cstdio>intn,h[1600],l[1600],hf[45][45];intmain() 查看详情

cogs1264.[noip2012]开车旅行(70分暴力)

1264.[NOIP2012]开车旅行★★☆  输入文件:drive.in  输出文件:drive.out   简单对比时间限制:2s  内存限制:128MB【题目描述】小A和小B决定利用假期外出旅行,他们将想去的城市从1到N编号,且编号... 查看详情

cogs106.[noip2003]加分二叉树(区间dp)

106.[NOIP2003]加分二叉树★☆  输入文件:jfecs.in  输出文件:jfecs.out   简单对比时间限制:1s  内存限制:128MB【问题描述】设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,&... 查看详情

tyvj4239[noip2015提高组dayt3]斗地主

P2668斗地主题目描述牛牛最近迷上了一种叫斗地主的扑克游戏。斗地主是一种使用黑桃、红心、梅花、方片的A到K加上大小王的共54张牌来进行的扑克牌游戏。在斗地主中,牌的大小关系根据牌的数码表示如下:3<4<5<6<7<... 查看详情

cogs74.[noip2006]明明的随机数(splay小练习。。)

☆  输入文件:random.in  输出文件:random.out   简单对比时间限制:1s  内存限制:128MB【问题描述】   明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算... 查看详情

[noip2012]摆花

1270.[NOIP2012]摆花http://cogs.pro/cogs/problem/problem.php?pid=1270★  输入文件:flower.in  输出文件:flower.out   简单对比时间限制:1s  内存限制:128MB【题目描述】小明的花店新开张,为了吸引顾客,他想在... 查看详情

[noip2014]子矩阵

1812.[NOIP2014]子矩阵http://www.cogs.pro/cogs/problem/problem.php?pid=1812★★★  输入文件:submatrix.in  输出文件:submatrix.out   简单对比时间限制:1s  内存限制:256MB【题目描述】最暴力的算法是枚举选 查看详情

[noip2013]货车运输

1439.[NOIP2013]货车运输http://cogs.pro/cogs/problem/problem.php?pid=1439★★☆  输入文件:truck.in  输出文件:truck.out   简单对比时间限制:1s  内存限制:128MB【题目描述】 【来源】CCF全国信息学奥林匹 查看详情

[noip2008]传球游戏

1011.[NOIP2008]传球游戏http://cogs.pro/cogs/problem/problem.php?pid=1011★  输入文件:ballg.in  输出文件:ballg.out   简单对比时间限制:1s  内存限制:50MB【问题描述】上体育课的时候,小蛮的老师经常带着同... 查看详情

bzoj4318osu!&&tyvj1952easy

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4318,http://www.tyvj.cn/p/1952其实这两个题题意差不多,游戏都一样(一样吗?计分方式都不一样),都是连续的数值价值会变为多次方,只不过一个是变成三次方,一个是变成二次方。对O... 查看详情

cogs2096.不平凡的许愿树

【题目描述】noip要到了,大家来到许愿树前。这个许愿树不仅仅是许愿树,还有未卜先知的功能。众OIer问许愿树:“不平凡的许愿树,CCF告诉我们noip中会有两道题目从Openjudge上选择,你能不能告诉我是哪两道题。”许愿树想了... 查看详情