AtCoder ABC061 C : Chocolate Bar

一共有四种情况。

 一开始少考虑了第一种和第三种情况,一直WA。

代码就丑点吧。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;

ll h,w,ma,mi,ans;
ll S1,S2,S3; 

ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; }

int main(){
    ans = 1e15-1;
    h = read() ,w = read();
    
//    if(h<w){ swap(h,w); }
    
//    printf("%lld %lld\n",h,w);
    
    for(ll i = 1;i < h; i++){
        S1 = i * w;
        mi = S1 , ma = S1;
        if(w%2==1){
            S2 = (w / 2ll) * (h - i) * 1ll;
            S3 = ((w / 2ll) + 1ll) * (h - i) * 1ll;
            ma = max(ma,S2); mi = min(mi,S2);
            ma = max(ma,S3); mi = min(mi,S3);
        }else if(w%2==0){
            S2 = (w / 2ll) * (h - i);
            ma = max(ma,S2); mi = min(mi,S2);
        }
        ans = min(ans,ma - mi);
    }
//    printf("%lld\n",ans);
    
    for(ll i = 1;i < w; i++){
        S1 = i * h;
        mi = S1 , ma = S1;
        if(h%2==1){
            S2 = (h / 2ll) * (w - i) * 1ll;
            S3 = ((h / 2ll) + 1ll) * (w - i) * 1ll;
            ma = max(ma,S2); mi = min(mi,S2);
            ma = max(ma,S3); mi = min(mi,S3);
        }else if(h%2==0){
            S2 = (h / 2ll) * (w - i);
            ma = max(ma,S2); mi = min(mi,S2);
        }
        ans = min(ans,ma - mi);
    }
//    printf("%lld\n",ans);
    
    for(ll i = 1;i < h-1; i++){
        S1 = i * w;
        mi = S1 , ma = S1;
        if((h-i)%2==1){
            S2 = ((h-i) / 2ll) * w * 1ll;
            S3 = (((h-i) / 2ll) + 1ll) * w * 1ll;
            ma = max(ma,S2); mi = min(mi,S2);
            ma = max(ma,S3); mi = min(mi,S3);
        }else if((h-i)%2==0){
            S2 = ((h-i) / 2ll) * w;
            ma = max(ma,S2); mi = min(mi,S2);
        }
        ans = min(ans,ma - mi);
    }
//    printf("%lld\n",ans);
    
    for(ll i = 1;i < w-1; i++){
        S1 = i * h;
        mi = S1 , ma = S1;
        if((w-i)%2==1){
            S2 = ((w-i) / 2ll) * h * 1ll;
            S3 = (((w-i) / 2ll) + 1ll) * h * 1ll;
            ma = max(ma,S2); mi = min(mi,S2);
            ma = max(ma,S3); mi = min(mi,S3);
        }else if((w-i)%2==0){
            S2 = ((w-i) / 2ll) * h;
            ma = max(ma,S2); mi = min(mi,S2);
        }
        ans = min(ans,ma - mi);
    }
//    printf("%lld\n",ans);
    
    printf("%lld\n",ans);

    return 0;
}
原文地址:https://www.cnblogs.com/tuchen/p/13419876.html