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

京公网安备 11010502036488号