P7743 [COCI2011-2012#3] D’HONDT 题解
liangledong · · 题解
题意:
先从所有政党中选出得票数不少于总票数
思路:
先把符合条件的政党全部筛选出来,然后把每个代表的得分算出来,再从中选择
注意:题目的除法运算可能除不尽,要使用 double 进行运算,也尽量使用乘法,减少精度损失。
代码实现:
#include<bits/stdc++.h>
using namespace std;
int n,tot,t;//tot表示符合条件的政党数,t表示代表候选人人数
double x;
struct data{//存政党
double g;
int sum;
char ch;
}a[19],b[19];//a存所有政党,b存符合条件的政党
struct dat{//存代表
double s;
int num;
}c[209];//代表总量最大值为 12*14=168
int cmp(data a,data b){
return a.ch<b.ch;
}//按字典序排序政党
int cc(dat a,dat b){
return a.s>b.s;
}//按分数排序代表
int main(){
cin>>x>>n;
for(int i=1;i<=n;i++){
cin>>a[i].ch>>a[i].g;
if(a[i].g*20>=x){
b[++tot]=a[i];
for(int j=1;j<=14;j++){
double jj=j*1.0;
c[++t].num=tot;
c[t].s=b[tot].g/jj;//计算每个代表的分数
}
}
}
sort(c+1,c+1+t,cc);
for(int i=1;i<=14;i++){
b[c[i].num].sum++;//计算每个政党的代表人数
}
sort(b+1,b+1+tot,cmp);
for(int i=1;i<=tot;i++){
cout<<b[i].ch<<" "<<b[i].sum<<"\n";
}
return 0;
}