2632 - 席位分配

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

学校共有n个学院,分别是学院1, 学院2, ... ,  学院n。每个学院有Ni名学生,现须按人数比例组织一个学生会,学生会有席位m个,请求出每个学院分配学生的席位个数。分配原则为:首先计算每个学院所占学生会席位的理想个数ai= m * Ni/sum,其中sum=N1+N2+N3+…+Nn,然后把ai的整数部分对应的席位个数分配该学院,按此分配后,m个席位如果分不完,则继续根据ai的余数(即小数部分)的大小依次逐位分配剩下的席位(如果碰到两个学院的余数一样,则人数多的学院优先,如果人数也相等,则学院序号小的优先)。


题目输入

输入包含多组测试数据,每组数组第一行是两个正数n与m,其中1<n<100, n<=m<10000,接下来第二行是 n个正数ni。

题目输出

对于每组输入,输出 n个学院所对应的分配席位个数,要求每个数之间用空格分隔(注意每行最后一个数没有空格)

输入/输出样例

输入格式

3 20
103 63 34
3 18
100 50 50
2 2
1 100

输出格式

10 6 4
9 5 4
0 2

C++解答

#include <iostream>
#include <map>
#include<string>
#include<algorithm>
using namespace std;

const int N = 1000;
int nums[N];
int seats[N];



int main()
{
    int n, m, i;
    int sumNum, sumSeat;
    multimap<double, int> mm;
    double rest;

    while (cin>>n>>m)
    {
        sumNum = 0;        
        sumSeat = 0;
        mm.clear();

        for (i=0; i<n; i++)
        {
            cin>>nums[i];
            sumNum += nums[i];
        }
        
        
        for (i=0; i<n; i++)
        {            
            seats[i] = (m * nums[i]) / sumNum;
            sumSeat += seats[i];

            rest = (double)(m * nums[i]) / sumNum - seats[i];            
            mm.insert(pair<double, int>(rest, i));            
        }
        
        multimap<double, int>::reverse_iterator rit = mm.rbegin();
        while (sumSeat< m)
        {
            i = rit->second;
            seats[i]++;

            sumSeat++;
            rit++;
        }
        
        cout<<seats[0];
        for (i=1; i<n; i++)
            cout<<" " <<seats[i];
        cout<<endl;        
    }
    
    return 0;
}

Java解答

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while (in.hasNext()) {
			int n = in.nextInt();
			int[] nArray = new int[n];
			int[] mArray = new int[n];
			int[] newArray = new int[n];
			int[] m2Array = new int[n];
			double[] modArray = new double[n];
			int sum = 0;
			int m = in.nextInt();
			for (int i = 0; i < n; i++) {
				nArray[i] = in.nextInt();
				sum += nArray[i];
			}
			int mSum = 0;
			for (int i = 0; i < n; i++) {
				mArray[i] = m * nArray[i] / sum;
				newArray[i] = mArray[i];
				mSum += mArray[i];
				modArray[i] = (double) m * (double) nArray[i] / (double) sum
						- (double) mArray[i];
			}
			int dis = m - mSum;
			for (int i = 0; dis > 0; i++) {
				double maxA = Double.MIN_VALUE;
				int indexMax = 0;
				for (int j = 0; j < n; j++) {
					if (modArray[j] > maxA) {
						maxA = modArray[j];
						indexMax = j;
					}
				}
				newArray[indexMax] = mArray[indexMax] + 1;
				modArray[indexMax] = 0;
				dis--;
			}
			for (int i = 0; i < n; i++) {
				if (i != n - 1)
					System.out.print(newArray[i] + " ");
				else
					System.out.println(newArray[i]);
			}

		}
	}
}