JZOJ3452. 【NOIP2013中秋节模拟】长方形(rectangle)

Description

  鸡腿是CZYZ的著名DS,但是不想学数学的DS不是好GFS,所以鸡腿想通过提高数学水平来增强他的GFS气质!虽然你对鸡腿很无语,但是故事的设定是你帮助鸡腿增强了GFS气质,所以现在你必须教鸡腿学数学! 
  鸡腿想到了一个很高(sha)明(bi)的问题,在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子,每个石子都只能放在网格的交叉点上。问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。 
 

Input

一行输入三个正整数N,M,K。 
 

Output

一行输出一个正整数,表示最多的满足条件的长方形数量。 
 

Solution

结论就是:

 
 
代码
 1 var
 2   ans:int64;
 3   n,m,k:longint;
 4 function min(o,p:int64):int64;
 5 begin
 6   if o<p then exit(o);
 7   exit(p);
 8 end;
 9 
10 function max(o,p:int64):int64;
11 begin
12   if o>p then exit(o);
13   exit(p);
14 end;
15 
16 function fd(x:longint):int64;
17 begin
18   exit((x-1)*x div 2);
19 end;
20 
21 function main(x,y:longint):int64;
22 var
23   t:longint;
24 begin
25   t:=x;
26   if y<m then t:=y;
27   exit(fd(x)*fd(y)+fd(k-x*y)*t);
28 end;
29 
30 procedure main;
31 var
32   i,t,r,x:longint;
33 begin
34   if n>m then
35     begin
36       t:=n; n:=m; m:=t;
37     end;
38   r:=min(n,trunc(sqrt(k)));
39   ans:=0;
40   for i:=2 to r do
41     begin
42       x:=min(m,k div i);
43       if k>=x*(i+1) then continue;
44       ans:=max(ans,main(i,x));
45     end;
46 end;
47 
48 begin
49   assign(input,'rectangle.in');
50   assign(output,'rectangle.out');
51   reset(input);
52   rewrite(output);
53   readln(n,m,k);
54   main;
55   writeln(ans);
56   close(input);
57   close(output);
58 end.

猜你喜欢

转载自www.cnblogs.com/zyx-crying/p/9497463.html
今日推荐