1 条题解

  • 0
    @ 2025-8-24 22:20:04

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 櫻尘ིོི༹
    政委!好!

    搬运于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 ;

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

    信息

    ID
    5370
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者