牛牛和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