您的位置:首页 > 其它

三角蛋糕

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: