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 ;
当然,不愿意手写也可以用系统函数:
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;
}