zoukankan      html  css  js  c++  java
  • HNUSTOJ-1638 遍地桔子(贪心)

    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();
        }
    }
     
     
  • 相关阅读:
    P2168 [NOI2015]荷马史诗
    P3195 [HNOI2008]玩具装箱TOY
    P1972 [SDOI2009]HH的项链
    P2339 提交作业usaco
    P3974 [TJOI2015]组合数学
    P2831 愤怒的小鸟
    [校内模拟题4]
    P3952 时间复杂度
    P3531 [POI2012]LIT-Letters
    2019.10.1 qbxt模拟题
  • 原文地址:https://www.cnblogs.com/Pretty9/p/7406674.html
Copyright © 2011-2022 走看看