【NOIP2013模拟】Rainbow的信号

正解:类数位DP,统计二进制下0和一的个数,blablabla。。。具体不懂,要再问问,懂了再更。
我们可以考虑二进制: 
可以想到,将每一位分别求出,在统计起来就可以了。 
var n,m,tot0,tot1:int64;
i,j,l,k:longint;
ans1,ans2,ans3:int64;
a:array[1..100000] of longint;
b:array[1..100000,0..31] of longint;
e:array[0..30] of int64;
f,d,g:array[-1..100000] of int64;
procedure zh(x,y:longint);
var i,j:longint;
begin
        b[x,0]:=1;
        b[x,1]:=y;
        while b[x,b[x,0]]>1 do
        begin
                b[x,b[x,0]+1]:=b[x,b[x,0]] div 2;
                b[x,b[x,0]]:=b[x,b[x,0]] mod 2;
                inc(b[x,0]);
        end;
end;
procedure jianyu();
var i:longint;
begin
        for i:=1 to n do
        begin
                ans1:=ans1-a[i];
                ans2:=ans2-a[i];
                ans3:=ans3-a[i];
        end;
end;
procedure erjinzhi();
var i:longint;
begin
        e[0]:=1;
        for i:=1 to 30 do
        e[i]:=e[i-1]*2;
end;
procedure shuchu();
begin
        write(ans1/n/n:0:3);
        write(' ');
        write(ans2/n/n:0:3);
        write(' ');
        writeln(ans3/n/n:0:3);
end;
begin


        readln(n);
        for i:=1 to n do
        begin
                read(a[i]);
                zh(i,a[i]);
                if b[i,0]>m then m:=b[i,0];
        end;
        erjinzhi();
        for j:=1 to m do
        begin
                tot0:=0;
                tot1:=0;
                for i:=1 to n do
                begin
                        if b[i,j]=0 then
                        begin
                                f[i]:=f[i-1];
                                g[i]:=0;
                                d[i]:=tot1;
                                tot0:=i;
                        end
                        else
                        begin
                                f[i]:=f[tot1-1]+i-tot1;
                                g[i]:=i-tot0;
                                d[i]:=i;
                                tot1:=i;
                        end;
                        ans1:=ans1+f[i]*e[j];
                        ans2:=ans2+g[i]*e[j];
                        ans3:=ans3+d[i]*e[j];
                end;
        end;
        jianyu();
        shuchu();
end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值