Codeforces Round #375 (Div. 2)C. Polycarp at the Radio

C. Polycarp at the Radio  

一道分析题
1,仔细分以后易得,对于给定的n与m,min {bj,1<=j<=m}是确定的
      因为我们要保证它最大,所以把这n个元素平均分配成m份,答案ans1即为 [n/m]
2,再考虑如何调整序列的问题,显然,用到贪心思想
     首先统计每个小于m的a[i]的个数b[a[i]].然后从1 到 n枚举每个a[i],

      a,a[i]>m,则调用find函数找到一个x,满足b[x]<ans1把a[i]更新成x,并更新b[x]的个          数即操作数ans2

      b,b[a[i]]>ans1,同样调用find函数找到x,把a[i]更新成x,更新b[a[i]]、b[x]及                 ans2.

总结:主要的问题是如何增加b[x]<ans1的x 的数量,显然,有两种方法
           一个是用a[i]>m的数,另一个是用b[y]>ans1的y
反思:在拿到一道没有模板的题目时,先不要着急做,首先要仔细分析


program O_O;
 var
  i,j,k,n,m,x,ans1,ans2:longint;
  a,b:array[0..2000] of longint;
procedure init;
 var
  i:longint;
begin
  readln(n,m);
  for i:=1 to n do
   begin
    read(a[i]);
    if a[i]<=m then
     inc(b[a[i]]);
   end;
  ans1:=n div m;
end;
function find:longint;
 var
  i:longint;
begin
  for i:=1 to m do
   if b[i]<ans1 then exit(i);
  exit(maxlongint);
end;
procedure main;
 var
  i:longint;
begin
  for i:=1 to n do
   begin
    if a[i]>m then
     begin
      x:=find;
      if x=maxlongint then continue;
      a[i]:=x;
      inc(b[a[i]]);
      inc(ans2);
     end
    else if b[a[i]]>ans1 then
     begin
      x:=find;
      if x=maxlongint then continue;
      dec(b[a[i]]);
      inc(b[x]);
      a[i]:=x;
      inc(ans2);
     end;
   end;
end;
procedure print;
 var
  i:longint;
begin
  writeln(ans1,' ',ans2);
  for i:=1 to n do
   write(a[i],' ');
end;
begin
  init;
  main;
  print;
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值