【问题描述】
m× m的方阵上有n棵葱,你要修一些栅栏把它们围起来。一个栅栏是一段
沿着网格建造的封闭图形(即要围成一圈) 。各个栅栏之间应该不相交、不重叠
且互相不包含。如果你最多修k个栅栏,那么所有栅栏的长度之和最小是多少?
【输入格式】
第一行三个整数m,k,n。
接下来n行每行两个整数x,y代表某棵葱的位置。
【输出格式】
一行一个整数代表答案。
【样例输入 1】
6 1 4
1 3
4 2
4 4
6 4
【样例输出 1】
18
【样例输入 2】
6 2 4
1 3
4 2
4 4
6 4
【样例输出 2】
16
【样例解释】
你猜树上有啥。

 #include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e6+;
const int M=;
int m,n,k,xx[M],yy[M];
int cost[N],s[M];
int tot,nowmask,answer,full;
struct rect{
int x1,x2,y1,y2;
int mask,w;
rect(){}
rect(int _x1,int _y1,int _x2,int _y2){
x1=_x1,y1=_y1,x2=_x2,y2=_y2;
mask=;
for(int i=;i<n;i++) if(x1<=xx[i]&&xx[i]<=x2&&y1<=yy[i]&&yy[i]<=y2) mask|=(<<i);
w=((x2-x1+)+(y2-y1+))*;
if(mask==full) answer=w;
}
}a[N];
void dfs(int cnt,int j,int cost){
if(nowmask==full){
//if(clock()>=1950){printf("%d",answer);exit(0);}
answer=min(answer,cost);return ;
}
if(cnt>=k||j>tot||cost>=answer) return ;
for(int i=j;i<=tot;i++){
if(nowmask&a[i].mask) continue;
nowmask^=a[i].mask;
dfs(cnt+,i+,cost+a[i].w);
nowmask^=a[i].mask;
}
}
void DFS(int now,int cnt,int res){
if(now==n){
if(res<answer) answer=res;return;
}
if(res+(k-cnt)*>=answer) return;
for(int i=;i<=cnt;i++){
int pres=s[i];
s[i]|=(<<now);
DFS(now+,cnt,res-cost[pres]+cost[s[i]]);
s[i]^=(<<now);
}
if(cnt<k){
s[++cnt]=(<<now);
DFS(now+,cnt,res+);
}
}
#define name "dan"
int main(){
scanf("%d%d%d",&m,&k,&n);
full=(<<n)-;
for(int i=;i<n;i++) scanf("%d%d",&xx[i],&yy[i]);
if(n<){
for(int i=;i<n;i++){
for(int j=i;j<n;j++){
for(int k=j;k<n;k++){
for(int l=k;l<n;l++){
a[++tot]=rect(min(min(xx[i],xx[j]),min(xx[k],xx[l])),min(min(yy[i],yy[j]),min(yy[k],yy[l])),
max(max(xx[i],xx[j]),max(xx[k],xx[l])),max(max(yy[i],yy[j]),max(yy[k],yy[l])));
}
}
}
}
nowmask=;
dfs(,,);
printf("%d",answer);
}
else{
answer=;
for(int i=;i<=full;i++){
int sx=,mx=-,sy=,my=-;
for(int j=;j<n;j++){
if((i>>j)&){
if(xx[j]<sx) sx=xx[j];
if(xx[j]>mx) mx=xx[j];
if(yy[j]<sy) sy=yy[j];
if(yy[j]>my) my=yy[j];
}
}
cost[i]=(mx-sx+)*+(my-sy+)*;
}
DFS(,,);
printf("%d",answer);
}
return ;
}

版权申明:转载于shenben

思路:搜索,好好理解

济南学习 Day 2 T3 am的更多相关文章

  1. 济南学习 Day 3 T3 pm

    仙人掌(cactus)Time Limit:1000ms Memory Limit:64MB题目描述LYK 在冲刺清华集训(THUSC) !于是它开始研究仙人掌,它想来和你一起分享它最近研究的结果. ...

  2. 济南学习 Day 3 T3 am

    选数字 (select)Time Limit:3000ms Memory Limit:64MB题目描述LYK 找到了一个 n*m 的矩阵,这个矩阵上都填有一些数字,对于第 i 行第 j 列的位置上的数 ...

  3. 济南学习 Day 2 T3 pm

    它[问题描述]N个人坐成一圈,其中第K个人拿着一个球.每次每个人会以一定的概率向左边的人和右边的人传球.当所有人都拿到过球之后,最后一个拿到球的人即为胜者.求第N个人获胜的概率. (所有人按照编号逆时 ...

  4. 济南学习 Day 5 T3 am

    [题目描述] 众所不知,rly现在不会玩国际象棋.但是,作为一个OIer,rly当然做过八皇后问题.在这里再啰嗦几句,皇后可以攻击到同行同列同对角线,在 n*n的棋盘中,摆放n个皇后使它们互相不能攻击 ...

  5. 济南学习 Day 5 T3 pm

    科普一下: φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数.φ(1)= ...

  6. 济南学习 Day1 T3 pm

    [问题描述]小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在x轴正半轴和y轴正半轴分别挑选

  7. 济南学习 Day1 T3 am

    凝视[问题描述]背包是个好东西,希望我也有.给你一个二维的背包,它的体积是N*M.现在你有一些大小为1× 2和1×3的物品,每个物品有自己的价值.你希望往背包里面装一些物品,使得它们的价值和最大,问最 ...

  8. 济南学习 Day5 T3 晚

    回文串(palindromes) [题目描述] 判断是否能将字符串S分成三段非空回文串. [输入说明] 第一行一个整数T,表示数据组数. 对于每一个组,仅包含一个由小写字母组成的串. [输出说明] 对 ...

  9. 济南学习D3T1__线性筛和阶乘质因数分解

    [问题描述] 从1− N中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少. [输入格式] 第一行一个数字N. [输出格式] 一行,一个整数代表答案对100000007取模之后的 ...

随机推荐

  1. iOS开发——图层OC篇&Quartz 2D各种绘制实例

    Quartz 2D各种绘制实例 首先说一下,本篇文章只是介绍怎么使用Quartz 2D绘制一些常用的图像效果,关于Quartz和其他相关技术请查看笔者之前写的完整版(Quartz 2D详解) 一:画线 ...

  2. memached+asp.net 4.0 分布式缓存

    由于准备做一个商品站点,希望做一个memached缓存.折腾了一个多星期.本机是存进去取出来为空. 各种办法都试过了,还是不行.最后用同事电脑測试是能够的,然后将DEMO公布到阿里云也是能够的.支持. ...

  3. Quartz表达式

    “*”字符代表所有可能的值 因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天 “/”字符用来指定数值的增量 例如:在子表达式(分钟)里的“0/15”表示从 ...

  4. J​a​v​a​S​c​r​i​p​t​针​对​D​o​m​相​关​的​优​化​心​得

    JavaScript针对Dom相关的优化心得 组内同时总结的关于javascript性能优化注意些节.记录一下. 1. 批量增加 Dom 尽量使用修改 innerHTML 的方式而不是用 append ...

  5. SQL Sever 2008 数据库文件的备份和还原

    数据库文件备份保存的方式我知道的有两种,第一种就是我们知道到的简单的分离,生成.mdf和.ldf文件,然后使用的时候直接进行附加数据库就可以了. 那么还有生成备份的文件.bak 的,这个操作要在步骤: ...

  6. 解决faststone capture在台式机上录制屏幕视频没有声音的问题

    点击屏幕录像机: 在弹出的屏幕录像机窗口中选择录制音频,然后点击选项按钮: 在弹出的选项按钮中选择视频选项,将所有的多选框都选中,注:最后一个选项录制windows XP的工具提示最好也选上,我发现如 ...

  7. Cable master(二分题 注意精度)

    Cable master Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26596   Accepted: 5673 Des ...

  8. Java快速入门

    Java 是什么? Java 的特点: 面向对象 平台无关(跨平台): 简单 安全 体系结构 - 中性 可移植 健壮 多线程 解释型 高性能 分布式 动态 Java环境设置: Java SE可免费提供 ...

  9. Oracle基础 shutdown和startup

    一.shutdown命令:SHUTDOWN有四个参数:NORMAL.TRANSACTIONAL.IMMEDIATE.ABORT.缺省不带任何参数时表示是NORMAL. SHUTDOWN NORMAL: ...

  10. MySQL Internal - InnoDB存储引擎(行结构)

    InnoDB行存储的三个组成部分(说明: F字符表示列的数量) 名称(Name) 大小(Size) Field Start Offsets (F*1) or (F*2) bytes Extra Byt ...