题解:P10925 Happybob's Pancake (UBC001E)
xtx1092515503 · · 题解
作为常用 ID 前缀是 10925 的用户,那就交一份 P10925 的题解罢。
时隔约十个月的洛谷 submission。
首先考虑
- 从左往右第
i 列有n-i+1 个方格;第x 列第y 个方块记作(x,y) 。
即这个模式。
现在,贪心地,我们肯定会把矩形的角放到某个
直接思考如何放矩形并不是一个好选择,我们可以反向考虑:应该如何安排那些“不存在矩形顶点”的格子,使得未被矩形覆盖的格子数尽量少?
令
因此算法就很明了了:
然后考虑
为了减少脑力劳动,我们采取最暴力的方法:易发现坐标轴附近的
- 这种一言不合就枚举的方式我认为是有效减少分类讨论题脑力劳动以及代码量的高效方式。
void mina(){
scanf("%d%d",&n,&m),res=0;
if(!(n&1)){
n>>=1;
int b=n-m;
int l1=b/(m+1),n2=b%(m+1),l2=l1+1,n1=(m+1)-n2;
// printf("%d %d %d %d\n",l1,n1,l2,n2);
res=2ll*n*(n+1)-2ll*l1*(l1+1)*n1-2ll*l2*(l2+1)*n2;
}else{
n>>=1;
int b=n+1-m,l=b/(m+1);
for(int i=l-3;i<=l+3;i++)for(int j=l-3;j<=l+3;j++)
if(i>=0&&j>=0&&i+j<=b){
if(m==1){
if(i+j==b)
res=max(res,2ll*n*(n+1)+1-2ll*i*i-2ll*j*j);
}else{
int B=b-i-j;
int l1=B/(m-1),n2=B%(m-1),l2=l1+1,n1=(m-1)-n2;
res=max(res,2ll*n*(n+1)+1-2ll*l1*(l1+1)*n1-2ll*l2*(l2+1)*n2-2ll*i*i-2ll*j*j);
}
}
}
printf("%lld\n",res);
}