jzoj 4540. 【NOI2016模拟6.12】assign

Description

这里写图片描述

Input

这里写图片描述

Output

这里写图片描述

Sample Input

样例1:
2
1 2
10 9
2
样例2:
6
1 0 1 1 1 1
1 3 1 1 1 1
4
样例3:
4
1 2 5 4
9 7 8 9
3

Sample Output

样例1:
1.000000 0.000000
0.000000 1.000000
样例2:
1.000000 0.000000
0.000000 0.750000
0.000000 1.000000
0.750000 0.250000
0.250000 0.000000
0.000000 0.000000
样例3:
0.652778 0.000000
0.347222 0.212963
0.000000 0.930556
0.000000 0.856481

Data Constraint

这里写图片描述

Hint

这里写图片描述
这里写图片描述

分析:对于每一个人(x),我们认为他是最后一个进入复赛的,我们也就知道了分数线(cnt)。{l[x]<=cnt<=r[x]}
我们可以知道每个人进入复赛的概率。
p[i]=(r[i]-max(cnt,l[i])+1)/(r[i]-l[i]+1){i<x}
p[i]=(r[i]-max(cnt+1,l[i])+1)/(r[i]-l[i]+1){i>x}
(既然垫底,后面同分也不行)
p[i]=1 i=x
我们可以设f[i,j]为对于前i个人,有j个人进复赛的概率,有

f[i,j]=f[i-1,j-1]*p[i]+f[i-1,j]*(1-p[i])

设g[i,j]为后第i+1个到第n个人,有j个人进复赛的概率,转移同理。

那我们对于任何一个人y来说,x垫底有多少复赛的概率呢?

他排在晋级的K个人里面的第j个的概率就是
f[i][j]∗g[i][K−j],直接将这个值加到答案里面就可以了,分在哪一组,可以通过对j%4的值来判断。
不过因为cnt是[l[x],r[x]]之中随机的一个数,所以概率要乘上1/(r[x]-l[x]+1)

代码:

var le,ri:array[1..100] of longint;
    f,gl,gr:array[0..30,0..30,0..3] of extended;
    ans:array[1..30,0..1] of extended;
    t:extended;
    n,i,p:longint;
procedure calc(x,y:longint);
var i,j,k:longint;
begin
  for i:=0 to n+1 do
     for j:=0 to p do
        for k:=0 to 3 do f[i,j,k]:=0;
  f[y-1,0,0]:=1;
  for i:=y-1 to n-1 do
     for j:=0 to p do
        for k:=0 to 3 do
           if f[i,j,k]>0.1 then
             begin
               if ri[i+1]<x then f[i+1,j,k]:=f[i+1,j,k]+f[i,j,k]*(ri[i+1]-le[i+1]+1)
                 else if le[i+1]>x then f[i+1,j+1,k]:=f[i+1,j+1,k]+f[i,j,k]*(ri[i+1]-le[i+1]+1)
                   else
                   begin
                     if (k=2) or (k=3) then
                       begin
                         f[i+1,j,k]:=f[i+1,j,k]+f[i,j,k]*(x-le[i+1]+1);
                         f[i+1,j+1,k]:=f[i+1,j+1,k]+f[i,j,k]*(ri[i+1]-x);
                       end;
                     if k=1 then
                       begin
                         f[i+1,j,k]:=f[i+1,j,k]+f[i,j,k]*(x-le[i+1]);
                         f[i+1,j+1,k]:=f[i+1,j+1,k]+f[i,j,k]*(ri[i+1]-x+1);
                         f[i+1,j,2]:=f[i+1,j,2]+f[i,j,k];
                       end;
                     if k=0 then
                       begin
                         f[i+1,j,k]:=f[i+1,j,k]+f[i,j,k]*(x-le[i+1]);
                         f[i+1,j+1,k]:=f[i+1,j+1,k]+f[i,j,k]*(ri[i+1]-x);
                         f[i+1,j+1,1]:=f[i+1,j+1,1]+f[i,j,k];
                         f[i+1,j,3]:=f[i+1,j,3]+f[i,j,k];
                       end;
                   end;
             end;
end;
procedure doit(x:longint);
var i,j,k,l:longint;
    s,s1:extended;
begin
  for i:=0 to n+1 do
     for j:=0 to p+1 do
        for k:=0 to 3 do begin gl[i,j,k]:=0;gl[i,j,k]:=0; end;
  gl[0,0,0]:=1;gr[n+1,0,0]:=1;
  calc(x,1);
  for j:=0 to p do
     for k:=0 to 3 do gr[1,j,k]:=f[n,j,k];
  for i:=1 to n do
     for j:=0 to p do
        for k:=0 to 3 do gl[i,j,k]:=f[i,j,k];
  for i:=2 to n do
     begin
       calc(x,i);
       for j:=0 to p do
          for k:=0 to 3 do gr[i,j,k]:=f[n,j,k];
     end;
  for i:=1 to n do
     for j:=1 to p do
        if ri[i]>=x then
          begin
            l:=ri[i]-x;if le[i]>x then l:=ri[i]-le[i]+1;
            s:=gl[i-1,j-1,0]+gl[i-1,j-1,1];s:=s*l;
            s:=s*(gr[i+1,p-j,0]+gr[i+1,p-j,1]+gr[i+1,p-j,2]+gr[i+1,p-j,3]);
            s:=s-(gl[i-1,j-1,0]*l)*(gr[i+1,p-j,0]+gr[i+1,p-j,3]);
            s1:=s;
            s:=gl[i-1,j-1,2]*l;s:=s*(gr[i+1,p-j,0]+gr[i+1,p-j,3]);
            s1:=s1+s;
            l:=1;if le[i]>x then l:=0;
            s:=gl[i-1,j-1,0]+gl[i-1,j-1,1];s:=s*l;
            s:=s*(gr[i+1,p-j,0]+gr[i+1,p-j,1]+gr[i+1,p-j,2]+gr[i+1,p-j,3]);
            s1:=s1+s;
            l:=j mod 4;
            if (l=2) or (l=3) then ans[i,1]:=ans[i,1]+s1 else ans[i,0]:=ans[i,0]+s1;
          end;
end;
begin
  readln(n);
  for i:=1 to n do read(le[i]);
  for i:=1 to n do read(ri[i]);
  for i:=1 to n do begin ans[i,0]:=0;ans[i,1]:=0; end;
  readln(p);
  for i:=0 to 1000 do
     begin
       p:=p;
       doit(i);
     end;
  t:=1;
  for i:=1 to n do t:=t*(ri[i]-le[i]+1);
  for i:=1 to n do
     begin
       ans[i,0]:=ans[i,0]/t;
       ans[i,1]:=ans[i,1]/t;
     end;
  for i:=1 to n do writeln(ans[i,0]:0:6,' ',ans[i,1]:0:6);
end.
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值