1 条题解
-
0
自动搬运
来自洛谷,原作者为

櫻尘ིོི༹
政委!好!搬运于
2025-08-24 22:20:04,当前版本为作者最后更新于2021-06-14 09:47:01,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
本以为是道水题,结果调了我三个多小时,
自闭;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; }
- 1
信息
- ID
- 5370
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者