原题题号:1638
为了实验室的发展,队长决定在实验室外面的空地种桔子树。空地划分为N×M个格子,每个格子为1×1,队长买了N×M棵树苗。买树苗的时候,老板免费赠送了K袋肥料,这些肥料非常强力,可以使施肥格子和前后左右四个相邻格子(如果存在的话)中的桔子树产量加1。队长表示还想买肥料,但是队长很穷,买不起更多的肥料。每个格子都只能种一棵桔子树,每棵桔子树原来的产量是1,并且每个格子只能施肥一次。现在问题是求施加肥料后所有桔子树的最大总产量。
先输入一个T(T<=1000),表示数据组数。 每组数据输入3个整数N,M,K(1 <= N,M <= 20,0 <= K <=
1000),N和M表示空地的长宽,K表示肥料的袋数。
每一组数据输出一行,包含一个整数,表示所有桔子树的最大产量。
2
2 3 3
5 2 0
17
10
这题一开始我以为肥料作用的十字范围的土地都算施肥,想了好久想不出咋办,结果灰光同学告诉我只有施肥的土地才算施过肥,十字影响范围内的土地不算施肥。。。因此这题就简单了。
说白了,这题就是数格子,最先对中间的格子施肥(每施肥一次产量+5),其次对四周(不含四角,每施肥一次产量+4),最后对四角施肥(每施肥一次产量+3),但要注意,可能存在长或宽只有2的情况,也就是没有中间的格子,不存在+5的情况,还有可能出现长或宽只有1的情况,也有22格子,11格子的情况,可以特判处理一下即可,此题难度不大,代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int T,m,n,k,sum;
cin>>T;
for (int i = 1; i <= T;i++)
{
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;
}
//system("pause");
return 0;
}
本文作者:TTQ
本文链接:https://blog.ponder.fun/archives/12.html
最后修改时间:2020-02-09 10:12:49
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!