当前位置: 代码迷 >> 综合 >> hihocoder #1042 跑马圈地
  详细解决方案

hihocoder #1042 跑马圈地

热度:44   发布时间:2024-01-15 05:13:22.0

http://hihocoder.com/problemset/problem/1042?sid=1218064
http://www.cnblogs.com/boring09/p/4368198.html参考此神犇的博客
可以看出,包涵水塘0个顶定点时一定可以;
包涵水塘1个顶点时可以保持周长不变绕着走;
包涵2个顶点时需加长周长,肯定更劣,不必考虑;
包涵4个顶点时肯定可以;
把水塘统一转换到右下角,就可以直接从左上角开始画框,然后暴力枚举面积,判断即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,L,l,r,t,b,l1,r1,t1,b1,ans;
int main()
{scanf("%d%d%d",&n,&m,&L);scanf("%d%d%d%d",&l,&r,&t,&b);//转换到右下角if(l+r<=m&&t+b<=n){l1=m-r;r1=m-l;t1=n-b;b1=n-t;}else if(l+r<=m&&t+b>n){l1=m-r;r1=m-l;t1=t;b1=b;}else if(l+r>m&&t+b<=n){l1=l;r1=r;t1=n-b;b1=n-t;}for(int i=0;i<=L/2&&i<=n;i++){for(int j=0;j<=L/2&&j<=m&&i+j<=L/2;j++){if(i<=t1||j<=l1)ans=max(ans,i*j);if(i>t1&&j>l1&&i<=b1&&j<=r1)ans=max(ans,i*j-(i-t1)*(j-l1));if(i>b1&&j>r1)ans=max(ans,i*j-(b1-t1)*(r1-l1));}}printf("%d",ans);return 0;
}