牛客網
牛牛和 15 個朋友來玩打土豪分田地的遊戲,牛牛決定讓你來分田地,地主的田地可以看成是乙個矩形,每個位置有乙個價值。分割田地的方法是橫豎各切三刀,分成 16 份,作為領導幹部,牛牛總是會選擇其中總價值最小的乙份田地, 作為牛牛最好的朋友,你希望牛牛取得的田地的價值和盡可能大,你知道這個值最大可以是多少嗎?這道題也是典型的最大值最小化,或最小值最大化問題。這裡是讓16塊田地中最小的值最大化。輸入描述:
每個輸入包含 1 個測試用例。每個測試用例的第一行包含兩個整數 n 和 m(1 <= n, m <= 75),表示田地的大小,接下來的 n 行,每行包含 m 個 0-9 之間的數字,表示每塊位置的價值。
輸出描述:
輸出一行表示牛牛所能取得的最大的價值。
示例輸入
4 43332
3233
3332
2323
示例輸出
2
依然使用二分+貪心的方法,每次嘗試乙個min_v
,迴圈是while(l <= r)
,最後輸出l - 1
。
注意輸入是連著的,所以需要用char型別讀入,且為為了快速計算每一塊的面積,使用乙個pre_sum
陣列記錄以每乙個位置為右下角的矩形的值。
讀入的田地資料如下:
0 0 0 0 0計算出的0 3 3 3 2
0 3 2 3 3
0 3 3 3 2
0 2 3 2 3
pre_sum
陣列如下:
0 0 0 0 00 3 6 9 11
0 6 11 17 22
0 9 17 26 33
0 11 22 33 43
#include
#include
#include
#include
// int_max
using
namespace std;
int rows, cols;
// 行、列
vectorint>> f;
// fields 田地
vectorint>> pre_sum;
// 為了快速計算每一塊的值
inline
intcalc
(int x1,
int y1,
int x2,
int y2)
intcandivide
(int min_v)}if
(cnt >=4)
return
true;}
return
false;}
intmain()
getchar()
;// 讀掉換行
}while
(l <= r)
cout << l -
1<< endl;
}
二分 最小值最大化
問題描述 記得上學那會,fbs同學經常會欺負蘿蔔同學。有一次,他出了這麼一道題目,想為難一下蘿蔔同學。題目是這樣的 有n個整數x i,x i值的範圍從0到1000000000。要從中選出c個數 2 c n 使得任意兩個數差的絕對值的最小值盡可能大,求這個最大值。由於資料太大,這次蘿蔔同學的確被難住了...
最大化最小值 二分
aggressive cows 題目意思 農民約翰有用c隻牛,然後他有n個隔間,每個隔間都有自己的座標位置 一維的 pos,如何安排把牛安排進隔間才能使,所有牛之間距離的最小值最大,我們不需要求這個分配方案,我們只需要求這個最小距離的最大值,很裸的最小值最大化。輸入 n 5m 3x 輸出 3 在位置...
poj2456(二分最大化最小值,貪心)
translation 有n間牛舍在一條直線上面,要住進c頭牛。求每頭牛之間的最大的最小距離能是多少?solution 二分最大化最小值,貪心 首先二分列舉最優解,其次就是判定該次最優解是否可行。這一步驟可以按照貪心法來判定。最後逐步縮小範圍。note date 2016.11.1 include ...