• largest remainder method java impl


    /**
     * 最大余数分摊算法
     * 
    @author xhan
     *{
    @link=http://en.wikipedia.org/wiki/Largest_remainder_method}
     
    */
    public class ShareCalculator {

        public static  double[] calculate(double[] votes , double totalSeats) {
            double[] seats = new double[votes.length];
            double[] reminders = new double[votes.length];
            
            double totalVotes = 0;
            for (double vote : votes) {
                totalVotes += vote;
            }
            
            double hareQuota = totalVotes / totalSeats ;
            double allocatedSeats = 0;
            
            for(int i = 0; i < votes.length ;i++) {
                double voteDivHareQuota = votes[i] / hareQuota;
                seats[i] = Math.floor(voteDivHareQuota);
                reminders[i] = voteDivHareQuota - seats[i];
                allocatedSeats += seats[i];
            }

            double leftSeats = totalSeats - allocatedSeats;
            
            //allocate left seats to party with largest reminder 
            for (int i = 0; i < leftSeats; i++) {
                double max = 0;
                int maxIndex = 0;
                for (int j = 0; j < reminders.length; j++) {
                    if(reminders[j] > max) {
                        max = reminders[j];
                        maxIndex = j;
                    }
                }
                seats[maxIndex] += 1;
                reminders[maxIndex] = 0;
            }
            
            return seats;
        }
    }
  • 相关阅读:
    android的原理,为什么我们不需要太多的剩余内存(转)
    简单制作RPM二进包实例(转)
    电源相关术语
    Linux 查找指定文件并删除
    Linux内核中的内存屏障(转)
    分压、分流原理
    Linux内核入门—— __attribute__ 机制
    如何手工释放linux内存
    多核编程中的负载平衡难题(转)
    linux2.6.26内核中ARM中断实现详解(转)
  • 原文地址:https://www.cnblogs.com/xhan/p/2328955.html
Copyright © 2020-2023  润新知