开始以为能解方程的。
这里给出一个二次方程,S是字号,这里面的除号/都是整除哦,这样求出来的S是小于最大字号的,因为这里假定w/s都无法整除,加了一行。
发现这是个二次方程。


字符说明:p 页数,h行高,w页宽,word[ ] 每段文字数,s 字号边长, 左边的1可以提出来,是n,最后可以变换成一元二次不等式。
然后二分法

import java.util.Arrays;
import java.util.Scanner;


public class Main {
    public static boolean getWordNum(int size, int[] word, int p, int h, int w){
        if(size == 0 || w < size || h < size){
            return false;
        }
        int sumRow = 0;
        int rowWord = w / size;//一行文字数
        int rowMax = p * (h / size);
        for(int i = 0; i < word.length; i++){
            sumRow += word[i] / rowWord;
            if(word[i] % rowWord != 0){
                sumRow += 1;
            }
        }
        return sumRow <= rowMax;
    }


    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int p = sc.nextInt();//page
        int h = sc.nextInt();//height
        int w = sc.nextInt();//row word
        int[] word = new int[n];

        for(int i = 0; i < n; i++){
            word[i] = sc.nextInt();
        }
        int l = 1, r = 1000;
        int mid = l;
        while (l <= r) {
            mid = l + (r - l) / 2;
            if(getWordNum(mid, word, p, h, w)){
                l = mid + 1;
            }else{
                r = mid - 1;
            }
        }
        if(getWordNum(l, word, p, h, w)){
            System.out.println(l);
        }else if(getWordNum(mid, word, p, h, w)){
            System.out.println(mid);
        }else{
            System.out.println(r);
        }
    }
}