这一晚上。。。板子硬了点,睡的不太舒服,等会儿回宿舍补一觉~
在ID之间纠结了一阵子后,偶还是决定沿用Moon_1st这个ID,偶滴品牌不能丢了~ ^_^。
A:单纯模拟的~
B:刚开始想麻烦了,直观的想法是先排一下序,然后比较所有相邻且不同的数对,如果a(i+1)<=2*ai,那么必然输出Yes,由于(2^ai-1)^2 = 2^(2*ai)-2^(ai+1)+1,偶一直在考虑2^(ai+1)是否会对结果产生不利影响,不大容易看~但是从小case逐步增加的具体过程发现,除了ai==1的请况有影响外,其他的影响会随着ai的增大逐步递减,也就是没有影响。所以排序后直接判断相邻且不相等的数对就可以了。
C:一开始还兴冲冲地以为自己终于在正式比赛里碰到个网络流,没想到越看越不对劲,到最后正式确认是个水题~~不过孤立节点的trick需要注意一下,偶就改了一次,还好没被人cha到~
D:这个偶就木有什么发言权了,ff很快就秒掉了额。。。。偶还在纠结怎么写。。。直观的想法是sigma(C(sh-1, i)*C(sum-a[h], n-i-1)/C(sum-1,n-1)) (i=1,2,3,......,n-1)。偶还在想难道让偶用java BigDecimal么??不太确信用C++怎么写,先看得第五题,结果还是不会啊~看完后lock了一下代码,发现某些人C题有trick,然后就开始找人cha(貌似应该说hack)。。。。越hack越起劲啦,哈哈,头一次在cf里hack,四次都命中啦~也没再干别的。赛后听方方说你边乘边除不就算出结果来了么,偶想了想也是啊~,以前自己不是经常这么干么,怎么比赛的时候忘了。。。太菜鸟~
另外,此题方方有更简洁的解法,计算补集,结果p=1-(C(sum-a[h],n-1)/C(sum,n-1)) ~~好像是这么写吧~~~ orz~~~
E:再研究一下吧~~有点想法,但怕误导他人还是别说了~~
总结了一下,怎么和上次一样又是3个啊,下次继续吧~~还好靠C的一个trick赚了400pt的外快~~偶们房一衰貌似挂了一次,但是应是靠各种challenge排到了前头。。orz各种AC神,各种cha神~~orz ff~~去吃饭去咧~~
A:
View Code #include #include #include #include #include #include #include #include #include #include #include
B:
View Code #include #include #include #include #include #include #include #include #include #include #include
C:
View Code #include #include #include #include #include #include #include #include #include #include #include
补一下D的代码:
#include #include #include using namespace std; const int N = 1010; int n, m, h, sum, s[N]; double ans, a[105], b[105]; int main() { int i; scanf("%d%d%d", &n, &m, &h); sum = 0; for(i = 1; i <= m; i++) { scanf("%d", s+i); sum += s[i]; } if(sum < n) printf("-1\n"); else { for(i = 1; i < n; i++) { a[i] = (double)(sum-s[h]-i+1); b[i] = (double)(sum-i); } ans = 1.0; for(i = n-1; i > 0; i--) ans = ans*a[i]/b[i]; printf("%.8f\n", 1.0-ans); } return 0; }