HNUST 1638: 遍地桔子

1638: 遍地桔子

时间限制: 1 Sec   内存限制: 128 MB
提交: 715   解决: 136
[ 提交][ 状态][ 讨论版]

题目描述

为了实验室的发展,队长决定在实验室外面的空地种桔子树。空地划分为N×M个格子,每个格子为1×1,队长买了N×M棵树苗。买树苗的时候,老板免费赠送了K袋肥料,这些肥料非常强力,可以使施肥格子和前后左右四个相邻格子(如果存在的话)中的桔子树产量加1。队长表示还想买肥料,但是队长很穷,买不起更多的肥料。每个格子都只能种一棵桔子树,每棵桔子树原来的产量是1,并且每个格子只能施肥一次。现在问题是求施加肥料后所有桔子树的最大总产量。

输入

先输入一个T(T<=1000),表示数据组数。

每组数据输入3个整数N,M,K(1 <= NM <= 20,0 <= K <= 1000),NM表示空地的长宽,K表示肥料的袋数。

输出

每一组数据输出一行,包含一个整数,表示所有桔子树的最大产量。


题固然很水,但是正确率不到20%。。。话不多少,上思路

显然是贪心的思想,先放能加五的区域,不行了在找四的区域最后是三。。。这样的话就能保证最大,楼主今天心情好顺便做了一张图片,有点丑,求喷O(∩_∩)O哈哈~

但是不能让我们这么容易就AC了呦。。。没错,题目还有一个坑,就是长宽可能是1.。。这个时候,这个图就不好用了,需要特别判断一下,,,楼主就是太菜了,这儿就贡献了四五次WA,(习惯不好,大家不要学我,不然比赛的时候罚时就很高了),顺便说明一下,图中四个角均为边长为一的正方形。。。应该很好理解吧。。。代码很简单,今天就不写注释了,就是这么任性,有什么不懂,或者找到问题的,欢迎评论指正。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    ios::sync_with_stdio(0);
    int T,m,n,k,sum;
    cin>>T;
    while(T--)
    {
        cin>>m>>n>>k;
        sum=m*n;
        if(n>=2&&m>=2)
        {
            if(k<=(n-2)*(m-2))
                sum=sum+5*k;
            else if(k<=m*n-4)
                sum=sum+(5*(n-2)*(m-2))+4*(k-(n-2)*(m-2));
            else if(k<=m*n)
                sum=sum+(5*(n-2)*(m-2))+4*(2*m+2*n-8)+3*(k-(m*n-4));
            else
                sum=sum+5*(n-2)*(m-2)+4*(2*m+2*n-8)+12;
        }
        else
        {
            if(m==1&&n==1)
            {
                if(k!=0)
                    sum++;
            }
            else
            {
                if(m==1) swap(m,n);
                if(k<=m-2)
                    sum+=3*k;
                else if(k<=m)
                    sum+=3*(m-2)+2*(k-m+2);
                else
                    sum=sum+3*(m-2)+4;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值