ZOJ 3705 Applications
题意 : 真是一道又臭又长的模拟题啊,不过比赛的时候没看,赛完了补的。
给你N个候选人,让你从中选M个候选人,根据四个大规则来确定每个人的分数,然后选分数前M个人的输出。
1、在MOJ上做过题的根据以下规则来计算加分:
- 如果题目是MAOMAO中的,做对一道加2.5分
- 如果题目是Old Surgeon Contest中的做对一个加1.5分,当然在MAOMAO中没有与Old Surgeon Contest中相同的题
- 如果不是两个中的题,但是题号是素数的做对一道加1分
- 如果不是上边三种情况中的任何一种,做对一道加0.3分。
2、 Marjar学校每年都会举办比赛,如果申请人中有得了奖的,一等奖加36分,二等奖加27分,三等奖加18分,否则加0分。
3、还有在别的OJ上做比赛的,会根据他们做的情况进行加分,如果在那些OJ上做的比赛超过三场的,取第三高的分数进行运算,pts = max(0, (r - 1200) / 100) * 1.5,r 即第三高的分数,然后将pts加入到最后的得分中。
4、如果申请人是女生再多加上33分。
思路 :题意已经说的差不多了,接下来就可以模拟了。注意好细节就可以了。
#include <stdio.h> #include <string.h> #include <iostream> #include <stdlib.h> #include <algorithm> #include <string> #include <map> using namespace std ; struct node { string name ; double score ; bool operator<(node a)const{ if(score == a.score) return name < a.name ; return score > a.score ; } }pt[12400] ; map<string,int>mapp ; int Mao[12400] , OSC[12400] ,ss[12400]; int isprime(int n) { for(int i = 2 ; i*i <= n ; i++) if(n%i == 0) return 0 ; return 1 ; } int main() { int T,N,M,R,S,m,Q,n ; scanf("%d",&T) ; char nam[35] ; while(T--) { memset(Mao,0,sizeof(Mao)) ; memset(OSC,0,sizeof(OSC)) ; memset(ss,0,sizeof(ss)) ; mapp.clear() ; scanf("%d %d",&N,&M) ; scanf("%d",&R) ; for(int i = 0 ; i < R ; i++){scanf("%d",&m) ;Mao[m] = 1 ;} scanf("%d",&S) ; for(int i = 0 ; i < S ; i++){scanf("%d",&m) ; OSC[m] = 1 ;} scanf("%d",&Q) ; for(int i = 0 ; i < Q ; i++) { scanf("%s %d",nam,&m) ; if(m == 1) mapp[nam] += 36 ; else if(m == 2) mapp[nam] += 27 ; else if(m == 3) mapp[nam] += 18 ; else mapp[nam] += 0 ; } char sex ; for(int i = 0 ; i < N ; i++) { cin >> pt[i].name>>nam>>sex>>m>>n ; if(sex == ‘M‘) pt[i].score = 0 ; else pt[i].score = 33 ; pt[i].score += mapp[nam] ; int id ; for(int j = 0 ; j < m ; j++) { scanf("%d",&id) ; if(Mao[id]) pt[i].score += 2.5 ; else if(OSC[id]) pt[i].score += 1.5 ; else if(isprime(id)) pt[i].score += 1 ; else pt[i].score += 0.3 ; } for(int j = 0 ; j < n ; j++) scanf("%d",&ss[j]) ; if(n >= 3) { sort(ss,ss+n) ; pt[i].score += max(0.0, (ss[n-3] - 1200) / 100.0) * 1.5 ; } } sort(pt,pt+N) ; for(int i = 0 ; i < M ; i++) { cout<<pt[i].name ; printf(" %.3f\n",pt[i].score) ; } } return 0 ; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。