这道题在比赛的时候已经搞出来了大半,但是因为精度控制的不熟悉以及意识的模糊

导致最后也没有出来,赛后LL改了改细节和精度控制就过了,还是代码量太少了

首先可以注意到数据,给出的是最多不超过10条,最长不超过1000的链表

设cnt[i]为链i的长度,因此总的方案数fm=(cnt[1]+1)*(cnt[2]+1)*……*(cnt[n]+1)-1(题目要求至少取一个碎片)

则答案可以为总的几率/fm

因可以分别看两个部分,一个是所有碎片的总和,另一个是套装加成

先看第二个部分套装加成,对于每个套装加成,可先将该level存在的数给提取出来,我是放在t_val,right里面

right存放对应数的链表的右边还有多长

两个系数xishu,t_xishu分别表示

该链的个数不足i个的链的长度乘积,和该链的个数大于等于i个的链的长度乘积

因此可以枚举取法,然后t_xishu*xishu就是这个套装出现的次数,然后按照题意公式给出就行了

现在再来看第一个部分,因为我们已经枚举了所有的套装情况(除了1),因此只需要把上面说到的情况数*s,再加上只取一个链上的某一碎片的情况,就是第一部分的总和

最后一定要把两个部分先相加,再除以fm,因为多次除法会使得精度丢失非常厉害(fm估算可以到10^30)

代码如下:

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define MM(a,b,c) memset(a,b,sizeof(a[0])*(c+2))
using namespace std;
const int SIZEN=10005;
struct edge{int to,next;
};
edge e[SIZEN];
int val[SIZEN];
int head[SIZEN],sz,in[SIZEN];
int right[15],t_val[15];
int ll,cnt,bit[1050];
vector<int> num[15];
double fm;
void getbit(){for(int i=1;i<1024;i++){int ti=i;for(int j=0;j<10;j++){bit[i]+=ti&1;ti>>=1;}}
}
void init(int n){MM(head,-1,n);MM(in,0,n);sz=ll=cnt=0;
}
void addedge(int u,int v){e[sz].to=v;e[sz].next=head[u];head[u]=sz++;in[v]++;
}
void dfs(int u,int id){num[id].push_back(u);for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].to;dfs(v,id);}
}
void rebuild(int n){for(int i=0;i<n;i++)if(!in[i]){num[cnt].clear();dfs(i,cnt);ll=max(ll,(int)num[cnt].size());cnt++;}
}
void debug1(){for(int i=0;i<cnt;i++){for(int j=0;j<num[i].size();j++) printf("%d ",num[i][j]);printf("\n");}
}
double get_ans(){fm=1;int ccnt;double xishu,t_xishu;double s,ans=0;for(int i=0;i<cnt;i++)fm*=(int)(num[i].size()+1);for(int i=0;i<ll;i++){ccnt=0;t_xishu=1;for(int j=0;j<cnt;j++){if(num[j].size()>=i+1){right[ccnt]=(num[j].size()-i);t_val[ccnt++]=val[num[j][i]];}else t_xishu*=(double)(num[j].size()+1);}for(int j=1;j<(1<<ccnt);j++){xishu=1;s=0;int tj=j;for(int k=0;k<ccnt;k++){if(tj&1){xishu*=right[k];s+=t_val[k];}else xishu*=i+1;tj>>=1;}ans+=s*xishu*t_xishu;if(bit[j]>=2) ans+=s*xishu*t_xishu*bit[j]/ccnt;}}return ans/(fm-1);
}
void solve(){int n,m;int u,v;scanf("%d%d",&n,&m);init(n);for(int i=0;i<n;i++)scanf("%d",&val[i]);for(int i=0;i<m;i++){scanf("%d%d",&u,&v);addedge(u,v);}rebuild(n);double ans=get_ans();printf("%.3lf\n",ans);
}
int main()
{int _;scanf("%d",&_);getbit();while(_--) solve();
}

【HDU 4921】Map相关推荐

  1. 【 HDU - 5093】Battle ships(匈牙利算法,二分图匹配)

    题干: Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission ...

  2. 【HDU 5765】Bonds(进制运算妙用)

    [HDU 5765]Bonds(进制运算妙用) Bonds Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K ...

  3. 【HDU 5755】Gambler Bo(高斯消元)

    [HDU 5755]Gambler Bo(高斯消元) Gambler Bo Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072 ...

  4. 大数加法【HDU 1002】

    大数加法模板 一般的加法只要int类型的两数直接相加即可,大一点的数可以设为long long类型,而超过长整型的数则属于大数问题了,大数加法其实也比较简单,利用数组实现就可以啦: 主要思想如下: ( ...

  5. 【HDU - 1455】Sticks (dfs + 剪枝)

    题干: George took sticks of the same length and cut them randomly until all parts became at most 50 un ...

  6. 【HDU - 4006】The kth great number (优先队列,求第k大的数)

    题干: Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to wri ...

  7. 【HDU - 4217 】Data Structure? (线段树求第k小数)

    题干: Data structure is one of the basic skills for Computer Science students, which is a particular w ...

  8. 【HDU - 1754】I Hate It (线段树模板 单点覆盖更新+区间最大值查询)

    题干: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当 ...

  9. 【HDU 6973】Bookshop 树剖+平衡树

    [HDU 6973]Bookshop 树剖+平衡树 [引言] ​ 平衡树的题做得比较少,难得补一次神题,记录一下供以后学习. [题意] ​ 给出一棵 nnn 个结点的树,每个结点有一个价值为 pip_ ...

最新文章

  1. python 打包 .app 运行 控制台窗口_Python打包工具
  2. C#Redis列表List
  3. python简单项目-4个Python经典项目实战,练手必备哦!
  4. 剑指 Offer 11. 旋转数组的最小数字 简单
  5. Nginx +uwsgi+django配置
  6. 企业如何正确选择云ERP管理软件
  7. bigdecimal 等于0_好程序员Java培训分享BigDecimal的用法
  8. AlexNet网络构建与训练
  9. 创造性模式——原型模式
  10. HTML5动画软件工具编辑器 HTML5动画分类 工具推荐
  11. python图灵机器人怎么退出_python调用图灵机器人实现微信自动回复
  12. 目标检测综述——单阶段检测器
  13. 自创算法实现Reporting Service中多值判定
  14. Unity HTC Vive手柄汉诺塔操作
  15. 华夏基金:养老是基金业下一个20年最大风口
  16. 匆匆的一瞥,错过了一份正确的BIOS……,安装X64系统时错刷BIOS的彻底死机过程以及解决方法...
  17. android怎么实现记住密码功能,Android学习笔记——记住密码的功能实现(一)
  18. android ViewPager2的使用教程
  19. 计算机学院新年祝福语,学院20周年祝福语
  20. Programing Exercise 4:Neural Networks Learning

热门文章

  1. [转载] 相机越贵画质越好?聊聊CMOS设计
  2. Docker+VSCode 配置属于自己的炼丹炉
  3. oracle 39083错误,Oracle数据库导入导出时,ORA-39083;ORA-00439错误解决思路
  4. 以梦为马,以汗为泉,不忘初心,不负韶华。
  5. Ubuntu 16.04安装编译MRPT 1.5.7
  6. 局域网内访问win7共享文件夹的完整解决方案
  7. this作用域和闭包
  8. ODA开发/CAD二次开发/C#开发-- “System.AccessViolationException尝试读取或写入受保护的内存,这通常指示其他内存已损坏”异常快速排除思路与建议(踩坑血泪史)
  9. linux进程,Linux进程查看
  10. html里文本框怎么取消黑框,怎么取消word的文本框