开始以为能解方程的。
这里给出一个二次方程,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); } } }