题意:给出一些段落,每个段落有一些字,一页有w列,h行,求最大字体大小是多少?
解题思路:二分font size大小。由于w 和 h限定,所以font size最大为min(w, h)
易错点:首先应该枚举出行数,然后判断每页可以放多少行,注意,字不能跨页。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <climits>
using namespace std;
const int N = 1001;
int n, w, h, p;
int a[N];
int calc(int fontSz) {
int cnt = 0;
// 一行可放多少字
int row = w / fontSz;
// 每段所有字累加需要多少行
for(int i = 0; i < n; ++ i) {
cnt += (a[i] / row + ((a[i] % row != 0) ? 1 : 0)) * fontSz;
}
return cnt;
}
int solve() {
int lf = 0, rt = min(w, h)+1;
while(lf < rt - 1) {
int fontSz = lf + (rt - lf) / 2;
int mid = calc(fontSz);
// 易错点,(h / fontSz)表示每页最多可放多少行
if(mid / fontSz > p * (h / fontSz) ) rt = fontSz;
else lf = fontSz;
}
return lf;
}
int main()
{
int tcase;
cin >> tcase;
while(tcase --) {
cin >> n >> p >> w >> h;
for(int i = 0; i < n; ++ i)
cin >> a[i];
cout << solve() << endl;
}
return 0;
}