领先投票.md

投票问题

如果一个选举有p 个人投A 的票,q 个人投B 的票,p > q,那么,在整个投票过程中A 的票累计数一直严格多于B 的票累计数的概率? (p-q)/(p+q)

分析

一个投票次序如果A 的选票累计数从头到尾都一直严格领先于B 的选票累计数,

我们就把它叫做有利次序,否则叫无利次序。显然,凡是以B 票开始的次序都是无利
次序。在以A 票开始的次序中,也有一些是无利次序。怎么来数这些无利次序呢?我
们知道有利次序永远不能有A 票数与B 票数相等的时候。换句话说,任何无利次序都
必须要在某一个时间出现两个选票数相等的时候。我们把第一次A,B 票数相等的点叫
E 点。现在把从第一票到E 点的所有票都反转,也就是说A 票换成B 票,B 票换成A 票。
这个次序就变成了一个以B 票开始的次序。这样,我们建立了一个以A 开始的无利次
序到以B 开始的次序的对应。反过来,因为A 的总票数大于B 的总票数,所以,以B
票开始的次序必须出现A 票数与B 票数相等的时候。通过上面的反转变化,我们可以
把任意以B 开始的次序换成一个以A 开始的无利次序。也就是说,我们在以A 开始的
无利次序与所有以B 开始的次序中建立了一个1-1 对应。所以,所有无利次序等于两
倍于以B 开始的所有次序。那么,以B 开始的次序有多少呢?由于A 有p 票,B 有q 票,
以B 票开始的次序占总次序数的q/(p + q)。所以,有利次序的概率是1 - 2*q/(p + q)
= (p - q)/(p + q)。证毕。

java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.text.DecimalFormat;


public class B {

        public void solve()
        {
            try {
                BufferedReader br = new BufferedReader(new FileReader("D:/IIT Hyd Sem-4/CJdata/B-small-attempt0.in"));
                BufferedWriter bw = new BufferedWriter(new FileWriter("D:/IIT Hyd Sem-4/CJdata/B_out.txt"));
                //BufferedWriter bw = new BufferedWriter(new FileWriter("D:/IIT Hyd Sem-4/CJdata/B_out_Large.txt"));
                int T = Integer.parseInt(br.readLine());
                for(int t=0;t<T;t++)
                {
                    //int M = Integer.parseInt(br.readLine());
                    double ans=0;
                    String[] s = br.readLine().split(" ");
                    int N = Integer.parseInt(s[0]);
                    int M = Integer.parseInt(s[1]);
                    ans = (double)(N-M)/(N+M);
                    //double x = 22/7; 
                    String str = new DecimalFormat("0.00000000").format(ans);

                    bw.write("Case #"+(t+1)+": "+str+"\n");
                }
                br.close();
                bw.close();
            }
            catch (Exception e) {
                e.printStackTrace();
            }

        }
        public static void main(String[] args) {
            B a = new B();
            a.solve();
        }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章