牛牛和15朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成26份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地,作为牛牛最好的朋友,你希望牛牛取得的田地价值和尽可能大,你知道这个值最大可以是多少吗? 输入两个整数n和m(1≤n,m≤75)表示田地的大小,接下来n行,每行包括m个0-9之间的数字,表示每块


牛牛和15朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成26份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地,作为牛牛最好的朋友,你希望牛牛取得的田地价值和尽可能大,你知道这个值最大可以是多少吗? 
输入两个整数n和m(1n,m75)表示田地的大小,接下来n行,每行包括m个0-9之间的数字,表示每块位置的价值: 

4 4
3332
3233
3332
2323

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include<memory.h>
#define _CRT_SECURE_NO_DEPRECATE
using namespace std;
const int N = 10010;
char str[100];
int a[110][110];
int sum[110][110], n, m;
int calc(int x, int y, int i, int j){
    return sum[x][y] - sum[x][j] - sum[i][y] + sum[i][j];
}
bool judge(int x){
    for (int i = 1; i <= m - 3; i++)
    {
        for (int j = i + 1; j <= m - 2; j++)
        {
            for (int k = j + 1; k <= m - 1; k++)
            {
                int last = 0, cnt = 0;
                for (int r = 1; r <= n; r++){
                    int s1 = calc(r, i, last, 0);
                    int s2 = calc(r, j, last, i);
                    int s3 = calc(r, k, last, j);
                    int s4 = calc(r, m, last, k);
                    if (s1 >= x && s2 >= x && s3 >= x && s4 >= x){
                        last = r; cnt++;
                    }
                     printf("i = %d j = %d k = %d last = %d\n",i, j, k, last);
                }
                if (cnt >= 4)return true;
            }
        }
    }
    return false;
}
int main(){
    while (scanf("%d%d", &n, &m) > 0){
        
        for (int i = 1; i <= n; i++){
            scanf("%s", str + 1);
        
            for (int j = 1; j <= m; j++){
                a[i][j] = str[j] - '0';//这样输入连续的数字到数组,先输入到字符串
            }
        }
        for (int i = 0; i <= n; i++){
            for (int j = 0; j <= m; j++){
                cout << a[i][j] << " ";
            }
            cout << endl;
        }
        cout << endl;
        memset(sum, 0, sizeof sum);
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= m; j++){
                sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];
            }
        }
        for (int i = 0; i <= n; i++){
            for (int j = 0; j <= m; j++){
                cout << sum[i][j] << " ";
            }
            cout << endl;
        }
        int l = 0, r = sum[n][m], ans = 0;
        while (l <= r){
            int m = (l + r) >> 1;
            
            if (judge(m)){
                l = m + 1;
                ans = m;
            }
            else r = m - 1;
        }
        printf("%d\n", ans);
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 第一题:有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗? 阶乘因式分解(一) 给定两个数m,n,其中m是一个素数。 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m。 输入第一行是一个整数s(0 牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i] (1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证:1、放进去的鱼是安全的,不会被其他鱼吃掉 2、这条鱼放进去也不能吃掉其他鱼 PHP牛牛游戏算法 第八题:牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因,其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,顺序对是指满足 i < j 且 A[i] < A[j] 的对数,请帮助牛牛计算出,符合这个要求的合法排列的数目。 问题陈述: 给定n种物品和一个背包.物品i的重量是Wi,其价值为Vi,背包的容量为C.在选 择物品i装入背包时,可以选择物品i的一部分,1<= i <=n.问应如何选择装入背包 中的物品,使得装入背包中物品的总价值最大. 2017-5-14 湘潭市赛 Partial Sum 给n个数,每次操作选择一个L,一个R,表示区间左右端点,该操作产生的贡献为[L+1,R]的和的绝对值-C。 0<=L 牛牛的背包问题 有一个背包,容量为m,然后有n个货物,重量分别为w1,w2,w3...wn,每个货物的价值是v1,v2,v3...vn,w和v没有任何关系,请求背包能装下的最大价值 螺旋填数:读入两个整数m,n,输出一个m行n列的矩阵,这个矩阵是1~m*n这些自然数按照右、下、左、上螺旋填入的结果。
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM