排试场(move)

排试场

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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值