三角蛋糕
2016-06-27 17:31
741 查看
问题描述 Description
XP 在机房里放了一块正三角形的大蛋糕,但是第二天他发现蛋糕被老鼠咬坏了。XP 不想让蛋糕白白的被浪费,于是他把蛋糕分割成了一个个的小正三角形(如上图所示)。黑色的小正三角形表示老鼠把那一块咬坏了。 XP 想要切出一块最大的没被老鼠咬坏正三角形的蛋糕,可是最大的三角形有多大呢?
输入描述 Input Description
第一行,一个整数 N ,表示 XP 把蛋糕纵向划分为 N 行。接下来的 N 行,第 i 行包括了 (n−i)∗2+1 个有效字符。 ′−′ 表示这块蛋糕是好的, ′#′ 表示这块蛋糕被咬坏了。为了保持三角形的形状,输入文件中会出现空格。
输出描述 Output Description
一行一个整数,表示最大的三角形包括的小三角形数。输入样例 Input Description
5 #-##----# -----#- ---#- -#- -
输出样例 Sample Output
9数据范围及提示 Data Size & Hint
对于 30% 的数据,满足 n≤5对于所有的测试数据,满足 n≤100。
分析 I Think
设 ai,j 表示第 i 行,至第 j 个字符有连续多少个 −。观察三角形的特征,首先是 1 个,然后是 3 个,在是 5 个…
我们枚举那最上面的三角形的位置,这样,对于 (i,j) ,如果 ai,j=0 是不能拼出三角形的。如果一奇一偶,那么它只能最为正方的正三角形的第一个,那我们就从 1 枚举 delta ,直到 ai+delta,j+delta<delta∗2+1 为止,最后的 delta∗delta 就是能拼出的最大正三角形。同理,不是一奇一偶的情况也可以这么想。
代码 Code
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[201][201]; char str[201]; int n; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%s",str+i); for(int j=i;j<=(n<<1)-i;++j) if(str[j] == '-') a[i][j] = a[i][j-1]+1; else a[i][j] = 0; } int ans = 0; int delta; for(int i=1;i<=n;++i) for(int j=i;j<=(n<<1)-i;++j) if(a[i][j]){ if(!(i*j&1) && (i&1||j&1)) for(delta=1;a[i+delta][j+delta]>=(delta<<1)+1;++delta); else for(delta=1;a[i-delta][j+delta]>=(delta<<1)+1;++delta); ans = max(ans,delta*delta); } printf("%d",ans); return 0; }
相关文章推荐
- Java虚拟机参数设置
- 小问题记录
- SQLiteOpenHelper 类
- TSF自定义候选词列表界面
- Java中的内存泄漏问题
- Servlet实现重定向的两种方式
- 在linux上如何通过composer安装yii
- 【C#语言学习】之如何在VS2015中使用git管理代码
- 事务的原子性与提交区别
- Android中监听Home键的4种方法总结
- 四张图包含了020所有的秘密
- JAVA配置文件的读取
- JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)
- 『Python数据分析与挖掘实战』第五章:挖掘建模
- placeholder IE兼容问题
- 自动发现服务是怎样工作的?
- JAVA集合(二)-ArrayList
- python ValueError: ndmin bigger than allowable number of dimensions NPY_MAXDIMS (=32)
- mysql 5.7.13 在ubuntu上的安装以及部分简单说明
- 20. Valid Parentheses(stack)