1638: 遍地桔子
时间限制: 1 Sec 内存限制: 128 MB提交: 711 解决: 134
[提交][状态][讨论版]
题目描述
为了实验室的发展,队长决定在实验室外面的空地种桔子树。空地划分为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
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<vector> using namespace std; int n, m, k; vector<int> v; const int dir[4][2]={{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; int cal(int i, int j){ int cnt = 1; for(int d = 0; d < 4; d++){ int x = i + dir[d][0], y = j + dir[d][1]; if(x > 0 && x <= n && y > 0 && y <= m) cnt++; } return cnt; } void Solve_question(){ v.clear(); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) v.push_back(cal(i, j)); sort(v.begin(), v.end()); int ans = 0; for(int i = v.size() - 1; i >= 0; i--) if( k ) ans += v[i] + 1, k--; else ans += 1; printf("%d ", ans); } int main(){ int T; scanf("%d", &T); while(T--){ scanf("%d %d %d", &n, &m, &k); Solve_question(); } }