NOI全国赛(1998)——围巾裁剪
裁缝有一块非常珍贵的丝绸围巾。可惜的是,围巾的某些部分已经被蛀虫给咬坏了。裁缝当然不愿意就这么把围巾给丢了,于是,他想把围巾给裁成两块小围巾送给他的两个女儿。自然,两块小围巾的面积之和越大越好。
这块围巾是一个正三角形,三条边被均匀地分成了N段,即这个正三角形被均匀地分成了N2个单元,每个单元是一个面积为1的正三角形。图一所 示为一个N=5的围巾,图中带阴影的单元表示被蛀虫咬坏的部分。从上往下看,围巾被分成了N行,第一行有1个单元,第二行有3个单元,其中有2个是形如D 的,有1个是形如Ñ 的(这两种三角形我们认为是形状相同的)。第三行有5个,其中有3个是形如D 的,有2个是形如Ñ 的…… 。用坐标(X,Y)给每个单元定位,第一行的单元的坐标为(1,1);第二行从左到右的三个单元的坐标依次为(2,1)、(2,2)、(2,3);

围巾的剪裁条件如下:
裁成的两块小围巾形状与原来的大围巾完全相同,都是正三角形。
每一块小围巾里都不存在被蛀虫咬坏的部分。
裁剪时必须沿着单元的边界裁剪。
要求两块小围巾的面积的总和最大。
图中,最优的裁剪方法已经用粗线画了出来,面积和为4+9=13。
现在需要你编一个程序来帮助裁缝解决这个问题。
Input
第一行为一个整数N(1<=N<=100),表示这块围巾总共被分成了N2个单元。第二行为一个整数M(0<= M<=N2-2),表示这块围巾共有M个单元被蛀虫咬坏了。
接下的M行,每一行有两个正整数X和Y,为这M个被蛀虫咬坏的单元的坐标。
输入文件中同一行相邻两项之间用一个或多个空格隔开。
Output
仅含一个整数,为你所找到的裁出两块小围巾面积总和的最大值。z
SS:用DP的方法;DP出每个小正三角形能延伸多少层,枚举割线,分成小三角形和梯形,取ans的最大值再旋转120度,循环3次继续DP下去
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int n,x,y,m,ans;
int a[10001][20001];
int b[10001][20001];
void make(){
for(int i=1;i<=n;++i)if(a[n][i*2-1]!=-1)a[n][i*2-1]=1;
for(int i=n-1;i>=1;--i)
for(int j=1;j<=i;++j)if(a[i][2*j-1]!=-1){
a[i][2*j-1]=1;
if(a[i+1][2*j-1]!=-1&&a[i+1][2*j]!=-1&&a[i+1][2*j+1]!=-1)
a[i][2*j-1]=min(a[i+1][2*j-1],a[i+1][2*j+1])+1;
}
for(int i=2;i<=n;++i)
for(int j=1;j<=i-1;++j)if(a[i][2*j]!=-1){
a[i][2*j]=1;
if(j!=1&&j!=i-1&&a[i-1][2*(j-1)+1]!=-1&&a[i-1][2*(j-1)]!=-1&&a[i-1][2*j]!=-1)
a[i][2*j]=min(a[i-1][2*(j-1)],a[i-1][2*j])+1;
}
}
void ask(){
int max1,max2;
for(int i=1;i<n;++i){//枚举分割线
max1=0,max2=0;
for(int j=1;j<=i;++j){
for(int k=1;k<=j;++k)max1=max(min(i-j+1,a[j][k*2-1]),max1);
for(int k=1;k<=j-1;++k)max1=max(a[j][k*2],max1);
}
for(int j=i+1;j<=n;++j){
for(int k=1;k<=j;++k)max2=max(a[j][k*2-1],max2);
for(int k=1;k<=j-1;++k)max2=max(max2,min(j-i,a[j][k*2]));
}
if(max1!=0&&max2!=0)ans=max(ans,max1*max1+max2*max2);
}
}
void splay(){
for(int i=1;i<=n;++i){
for(int j=1;j<=i;++j)
if(a[i][2*j-1]==-1)b[n-i+j][(n-i)*2+1]=-1;
for(int j=1;j<=i-1;++j)if(a[i][2*j]==-1)b[n-i+j+1][(n-i)*2+2]=-1;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=2*i-1;++j)a[i][j]=b[i][j];
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)scanf("%d%d",&x,&y),a[x][y]=-1;
for(int tt=1;tt<=3;++tt){
make();ask();
memset(b,0,sizeof(b));
splay();
}
printf("%d",ans);
return 0;
}
NOI全国赛(1998)——围巾裁剪的更多相关文章
- NOI全国赛(2001)--食物链
今天写了道并查集的题,看来并查集的题刷少了,,,,,用法好神奇啊!!!开三倍并查集 用i表示自己,i+n存天敌,i+2*n存可以克制de,再逻辑判断一下即可. 所以,要意识到并查集的分类处理可以开不同 ...
- Codevs 1800 假面舞会 2008年NOI全国竞赛
1800 假面舞会 2008年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一年一度的假面舞会又开始了,栋栋也 ...
- Codevs 1074 食物链 2001年NOI全国竞赛
1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 动物王国中有三类动物 A,B ...
- 1729 单词查找树 2000年NOI全国竞赛
1729 单词查找树 2000年NOI全国竞赛 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 在进行文法分析的 ...
- 1074 食物链 2001年NOI全国竞赛
1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 动物王国中有三类动物 ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- CODEVS 1074 食物链 2001年NOI全国竞赛(洛谷 P2024)
题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并 ...
- 食物链 2001年NOI全国竞赛
时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B ...
- 6.28 NOI模拟赛 好题 状压dp 随机化
算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...
随机推荐
- linux 中c/c++实现终端命令行命令
在终端中可以从用下面命令获得帮助: man system 在c/c++代码中实现和在终端中输入的命令行一样的效果,以命令(audacious -p &)为例,该代码实现用audacious在后 ...
- Android中微信抢红包助手的实现
参考(感谢作者):http://www.jianshu.com/p/cd1cd53909d7 http://blog.csdn.net/jiangwei0910410003/article/detai ...
- MongoDB复制集之将现有的单节点服务器转换为复制集
服务器情况: 现有的单节点 Primary 192.168.126.9:27017 新增的节点 Secondry 192.168.126.8:27017 仲裁节点 ...
- 蓝牙门禁Android客户端
先来了解下Android传统蓝牙连接的大致简单的流程: 其中涉及到几个类依次来介绍,废话不多说,下面是从Android4.4开发指南蓝牙所用到的类的截图: 第一个类BluetoothAdapter: ...
- Python2和Python3中除法操作/的不同
X/Y 在3.0版本之前的Python中 >>>1/2 0 即一个整数(无小数部分的数)被另外一个整数除,计算结果的小数部分被截除了,只留下了整数部分 有时候,这个功能比较有用,譬如 ...
- javascript学习-目录
Javascript学习 第1章 Javascript简介 1.1 Javascript简史 1.2 Javascript实现 1.3 Javascript版本 第2章 Javascript入门 2. ...
- 中国大学MOOC中的后台文件传输
早期版本的中国大学MOOC一旦被挂起后,应用在完成当前下载任务后无法继续添加新任务,当然也无法将缓存状态写入数据库.这个问题能否顺利解决直接关系到用户体验. 顺便吐槽下,凡是使用了后台文件传输还提示你 ...
- 一个技术汪的开源梦 —— 微信开发工具包(WeixinSDK)
由于春节的关系 WeixinSDK 这个开源项目的进展比预期推迟了大约一个月的时间,值得高兴的是到目前为止该项目的重要模块已经开发完毕. - 关于项目 该项目的背景是现在微信公众号.微信服务号乃至微 ...
- 《经久不衰的Spring框架:@ResponseBody 中文乱码》
问题背景 本文并不是介绍@ResponseBody注解,也不是中文乱码问题的大汇总笔记,这些网上都有很多内容了.这边仅对几年前,一个卡壳了挺久时间的问题的解决过程做一个记录,以警惕自己,达到自醒得目的 ...
- [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)
这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...