Time Limit:10000MS Memory Limit:65536K
Total Submit:21 Accepted:11
Description
期中考之前,总要排一下试场。张校长为此心烦——每个试场拥有的桌椅数不同。为了排试场,不免
有些桌子要被移到别的试场去。为了减少移动量,张校长决定再开M个试场(M尽量要小,这是人之常
情),将每个试场多余的桌椅放入新试场内。由于教育局规定:每个试场的桌椅数必须相同。张校长
犯难了,于是他找到学NOIP的你,希望你能帮他点忙。(原试场是只出不进,新加的试场只进不出,
)。如右图:原先有了4个试场(四个角上,分别有11、12、13、14张桌椅),在中央加入了一个试
场,从第一个试场(左上角)取1套桌椅,从第二个试场(左下角)取2套桌椅,从第三个试场(右下
角)取3套桌椅,从第四个试场(右上角)取4套桌椅,移入中央的试场,则第一个试场还有11-1=10
套桌椅,第二个试场还有12-2=10套桌椅,第三个试场还有13-3=10套桌椅,第四个试场还有14-4=10套
桌椅,新加的中央试场就有了1+2+3+4=10套桌椅。这时,每个试场都有10套桌椅,就符合教育局的要
求(每个试场的桌椅数必须相同)。
Input
(move)
第一行两个数n(n <= 10000),r(r <= 60),其中n代表试场数,r表示张校长希望每个试场能有的桌椅数。
接下来n行,每行一个数x,第i行表示第i个试场所拥有的桌椅数x(x <= 80)
注:给出的数据一定有解。
Output
共两行
第一行:用一个空格隔开的两个数m,p。m表示需要再开的试场数(可以不开,不开时为0,m为正整数),p表示每个试场的桌椅数(p也为正整数)。
第二行:一个字符'T'或'F'(必须是大写),表示p是否大于r,若p>r输出'T',否则,则输出'F'
Sample Input
5 10
22
28
23
27
25
Sample Output
20 5
F
Source
算法:模拟
还算是挺有水平的一道模拟吧,我第一次做得了70分,原因就是没考虑min那个情况,这里一定注意
原试场只出不进,新试场只进不出,因此所分的平均值必须小于原试场的最小值,找一个最大的能整
除的数,这样可以保证多需要的试场最少。如果到根号那个值都没有发现能整除的数,那么就把所有
的都以1分为一组。
program move;
var
n,r,ans,sum,min:longint;
procedure init;
var
i,x,bf:longint;
flag:boolean;
begin
min:=maxlongint;
flag:=false;
readln(n,r);
readln(x);
bf:=x;
inc(sum,x);
for i:=2 to n do
begin
readln(x);
if x<min then min:=x;
if x<>bf then flag:=true;
inc(sum,x);
bf:=x;
end;
if not flag then
begin
writeln(0,' ',bf);
if bf>r then writeln('T') else writeln('F');
close(input);
close(output);
halt;
end;
end;
procedure main;
var
i,t:longint;
flag:boolean;
begin
for i:=2 to trunc(sqrt(sum)) do
begin
if (sum mod i=0) and (i<=min) then
begin
ans:=sum div i;
t:=i;
if i>r then flag:=true else flag:=false;
end;
end;
if ans=0 then
begin
writeln(sum-n,' ',1);
writeln('F');
close(input);
close(output);
halt;
end;
writeln(ans-n,' ',t);
if flag then writeln('T') else writeln('F');
end;
begin
assign(input,'move.in'); reset(input);
assign(output,'move.out'); rewrite(output);
init;
main;
close(input); close(output);
end.

133

被折叠的 条评论
为什么被折叠?



