UVa207 - PGA Tour Prize Money

本文介绍了一个用于处理高尔夫比赛成绩的系统,该系统能够读取参赛选手的数据,并根据规则筛选出符合条件的选手进行奖励分配。此外,系统还实现了对选手成绩的排序、奖金计算和排名等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<iomanip>
#include<sstream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
const int DQ = 500000000;
struct record{
    string name, place;
    int rd[4], total2, total4;
    double money;
    bool pro;
    int no;
};
int cmp2(const record &a,const record& b){
    if(a.total2!=b.total2)return a.total2<b.total2;
    else return a.name<b.name;
}
int cmp4(const record &a,const record& b){
    if(a.total4!=b.total4)return a.total4<b.total4;
    else return a.name<b.name;
}
double prize_all, prize[70];
vector<record> player;

int str2num(const string &s){
    int d=0;
    for(string::const_iterator it=s.begin();it!=s.end();++it) d=d*10+(*it-'0');
    return d;
}

inline void read_prize(){
    cin>>prize_all;
    for(int i=0;i!=70;++i){
        cin>>prize[i];
        prize[i]=prize[i]/100.0*prize_all;
    }
}
inline void read_player(){
    int num;
    cin>>num;
    player.resize(num);

    string in;
    getline(cin,in);

    for(vector<record>::iterator it=player.begin();it!=player.end();++it){
        getline(cin,in);
        it->name=in.substr(0,20);
        in=in.substr(20,in.size());

        istringstream ss(in);
        it->rd[0]=it->rd[1]=it->rd[2]=it->rd[3]=DQ,it->total2=it->total4=0;
        for(int i=0;i!=4;++i){
            ss>>in;
            if(in=="DQ") break;
            else it->rd[i]=str2num(in);
        }
        for(int i=0;i!=2;++i) it->total2+=it->rd[i];
        for(int i=0;i!=4;++i) it->total4+=it->rd[i];

        for(string::reverse_iterator sit=it->name.rbegin();sit!=it->name.rend();++sit) if(*sit!=' '){
            if(*sit=='*') it->pro=false;
            else it->pro=true;
            break;
        }
    }
}
inline void select(){
    int d=0,sum=0;
    sort(player.begin(),player.end(),cmp2);
    for(vector<record>::iterator it=player.begin();d!=70&&it!=player.end()&&(it->rd[0]!=DQ&&it->rd[1]!=DQ);++it){
        ++sum,++d;
        if(d==70){
            int last=it->total2;
            ++it;
            while(it!=player.end()&&it->total2==last)++sum,++it;
            break;
        }
    }
    player.resize(sum);
    sort(player.begin(),player.end(),cmp4);
}

vector<record>::iterator findnext(vector<record>::iterator it){
    do{
        ++it;
    }while(it!=player.end()&&!(it->pro));
    return it;
}

inline void getplace(){
    int place=1;
    for(vector<record>::iterator it=player.begin(),next;it!=player.end()&&(it->total4 < DQ);++it,++place){
        ostringstream ss;
        ss<<place;
        it->place=ss.str();
        next=it+1;
        int d=it->pro?1:0;
        while(next!=player.end()&&next->total4==it->total4){
            next->place=ss.str();
            if(next->pro) ++d;
            ++next,++place;
        }
        if(d>1) while(it!=next){
            if(!(it->money<0)) it->place+='T';
            ++it;
        }
        it=next-1;
    }
}

inline void getmoney(){
    int place=0;
    for(vector<record>::iterator it=player.begin();it!=player.end();++it) it->money=-1, it->no=-1;
    for(vector<record>::iterator it=player.begin(),next;it!=player.end()&&(it->total4<DQ)&&place<70;++it) if(it->pro) next=findnext(it);
    for(vector<record>::iterator it=player.begin(),next;it!=player.end()&&(it->total4<DQ)&&place<70;++it) if(it->pro){
        next=findnext(it);
        int d=1; double sum=prize[place];
        it->no=place;
        while(next!=player.end()&&next->total4==it->total4){
            next=findnext(next);
            ++d,++place;
            next->no=it->no;
            if(place<70) sum+=prize[place];
        }
        sum/=d;
        while(it!=next){
            if(it->pro) it->money=sum;
            ++it;
        }
        it=next-1;
        ++place;
    }
}
inline void printans(){
    cout<<"Player Name          Place     RD1  RD2  RD3  RD4  TOTAL     Money Won\n";
    cout<<"-----------------------------------------------------------------------\n";
    for(vector<record>::iterator it=player.begin();it!=player.end();++it){
        cout<<it->name<<' ';
        cout<<left<<setw(9)<<(it->total4>=DQ?" ":it->place);
        for(int i=0;i!=4;++i){
            if(it->rd[i]!=DQ) cout<<' '<<left<<setw(4)<<it->rd[i];
            else cout<<' '<<left<<setw(4)<<' ';
        }
        if(it->total4>=DQ) cout<<' '<<"DQ";
        else{
            cout.precision(2);
            cout.setf(ios::fixed);
            if(it->pro && it->no < 70 && !(it->money<0)){
                cout<<' '<<left<<setw(10)<<it->total4<<'$'<<right<<setw(9)<<it->money+1e-8;
            }else   cout << ' ' << it->total4;

        }
        cout<<'\n';
    }
}

int main(){
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--){
        read_prize();
        read_player();

        select();
        getmoney();
        getplace();

        printans();
        if(T) cout<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值