题目:http://hihocoder.com/problemset/problem/1288
手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P的字体最大值S。
思路:
1. 最大的字体:一页只放一个字,则S = min(W, H)
2. 枚举方式:对于每一个S,计算需要的行数,然后判断页数是否超过P
注意点:
1. 如果一段文字的最后一行没有被填满,下一段文字也必须从下一行开始。
2. 关于ceil和floor函数
- 需要包含头文件 #include <math.h>
- 参数类型应该为double。如果是个计算式子,要注意类型转换
int a, b; ceil(a/b);//结果不正确,因为a/b已经被截断,成为int型的数 ceil(a/(double) b);//ceil里面的值是个double类型
3. a / (b / c) 不一定等于 a / b * c
源码
1 #include <iostream> 2 #include <math.h> 3 using namespace std; 4 5 int main() 6 { 7 int cnt, N, P, W, H, a, S; 8 int as[1001]; 9 cin >> cnt; 10 while (cnt-- > 0) 11 { 12 cin >> N >> P >> W >> H; 13 a = 0; 14 15 for (int i = 0; i < N; i++) 16 cin >> as[i]; 17 int max = W>H ? H : W;//最大的字体大小,一页只放一个字 18 for (int i = max;; i--) 19 { 20 int lines = 0;//需要多少行 21 int perline = W / i;//一行可以放几个字 22 for (int a_i = 0; a_i < N; a_i++) 23 lines += ceil(as[a_i] / (double)perline); 24 if (ceil(lines / (H / i)) <= P) 25 { 26 cout << i << endl; 27 break; 28 } 29 } 30 } 31 return 0; 32 }