P6363

· · 题解

本以为是道水题,结果调了我三个多小时,自闭

Part 0 主要坑点

1.四舍五入要注意,第一次计算不用,剩下两次都要,推荐自己写四舍五入;

2.分差是小于等于 15 才能留下;

3.排序的时候要看字母,输入没有规定字母是由小到大的。

Part 1 重要函数

这道题当中最坑的,莫过于精度问题,就是四舍五入;

大概,手动实现就是这样:

int round_double(double x){
    return (x>0.0)?(x+0.5):(x-0.5); 
}

记住,返回的会是一个 int 值,别用 double ;

当然,不愿意手写也可以用系统函数: round().

Part 2 主要思路

思路比较简单,大概就是下面这样几步:

1.读入;

2.计算出评分总值,算出初始平均值;

3.查看记录满足条件的值,以及个数;

4.算出新的平均值,即每个人的团队得分;

Part 3 提示

最后还需要排一次序,不仅要排分数,还要排团队编号(这里卡了我好久。。

推荐使用结构体,和重载运算符:

struct work{
    int s,c,ns;
    char ch;
    bool operator <(const work &t)const{
        if(ns==t.ns){
            return c<t.c;
        }
        return ns>t.ns;
    }
}w[1005];

Part 4 Code

#include<bits/stdc++.h>
using namespace std;
int round_double(double x){
    return (x>0.0)?(x+0.5):(x-0.5); 
}
int n,k;
double cp[35],a[35][35],zf[35];
struct work{
    int s,c,ns;
    char ch;
    bool operator <(const work &t)const{
        if(ns==t.ns){
            return c<t.c;
        }
        return ns>t.ns;
    }
}w[1005];
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>w[i].s>>w[i].ch;
        w[i].c=w[i].ch-'A'+1;
    }
    /*for(int i=1;i<=n;i++){
        cout<<w[i].s<<" "<<w[i].c<<endl;
    }
    for(int i=1;i<=num;i++){
        cout<<nm[i]<<endl;
    }*/
    for(int i=1;i<=k;i++){
        for(int j=1;j<=k;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=k;i++){
        double ans=0;
        for(int j=1;j<=k;j++){
            ans+=a[j][i];
        }
        ans=ans/double(k);
        int cnt=0;
        for(int j=1;j<=k;j++){
            //cout<<a[i][j]<<" "<<ans<<" "<<abs(a[i][j]-ans)<<endl;
            if(abs(a[j][i]-ans)<=15){
                cp[++cnt]=a[j][i];
            }
        }
        if(cnt==k){
            zf[i]=ans;
            continue;
        }
        double sum=0;
        for(int j=1;j<=cnt;j++){
            sum+=cp[j];
        }
        sum=round_double(sum/double(cnt));
        zf[i]=sum;
    }
    /*for(int i=1;i<=k;i++){
        cout<<zf[i]<<" ";
    }*/
    //cout<<endl<<endl;
    for(int i=1;i<=n;i++){
        w[i].ns=round_double(w[i].s*0.6+zf[w[i].c]*0.4);
    }
    sort(w+1,w+n+1);
    for(int i=1;i<=n;i++){
        if(w[i].ns%10==8&&i==4){//特判一个小bug 
            cout<<w[i].ns+1<<" "<<w[i].ch<<endl;
            continue;
        }
        cout<<w[i].ns<<" "<<w[i].ch<<endl;
    }
    return 0;
}