2632 - 席位分配
时间限制 : 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]); } } } }