程序设计第一次训练题 B大力出奇迹

本文详细解析了一种基于竞赛编程的排序算法应用案例,通过读取参赛者解题信息,包括解题数量和罚时,利用结构体存储并实现定制化的排序逻辑。首先按解题数量降序排列,相同解题数量下按罚时升序排列,最终确保原始输入顺序的稳定性。文章深入探讨了数据读取技巧,特别是如何处理带括号的罚时数据,并分享了使用结构体和重载比较运算符的代码实现细节。

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

题意:
读取所给的人的做题的信息,来通过做题的数量,罚时等对这一组人进行排序。


思路:
即给定一组数据,其中包含了每个人的人名,解题的数量,以及错题罚时等信息,在读入人数量和单位罚时的后,一次读出每个人的自己的做题信息,来判断做题的多少,来对这些人的成绩进行排序。用结构题来存储每个人的信息,用字符数组读入人名,再读入成绩。注意每次cin后,判断,如果是正数,则做题数加1,并且做题时间加上。负数则不管,每次读入数据后,用getchar读入后一个字符,判断,如果是(,则读入括号中的数字,乘上单位罚时,加入到时间中去。再用getchar消化后一个),随后再cin读入下一个数据。第一次getchar读入的如果是不是(,则直接cin读入下一个数据。直到读入所有的数据后,结束。结构体中记得重载<,先以做题数量正序排列,再以罚时升序排列,最后以顺序排列,然后用sort函数排序后输出。最后注意输出时的格式要求。


总结:
这个题目主要是要判断字符的读取问题,即如何读出数字后,判断后面有没有括号,然后需要读出括号中的内容,其他的实现慢慢写还行。(但在最后的格式输出的时候,一开始用的cin和cout,只有第一名字左对齐了,其后的所有都右对齐了,后来用的printf挺好使,不知道哪里的问题。)


代码:

#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#include <iomanip>

using namespace std;

struct P{
	char name[10];  //姓名
	int a;           //正确的题数
	int b;           //罚时
	int c;          //一开始的顺序
	bool operator<(const P &p){
		if(a != p.a) return a>p.a;  //题数的降序
		if(b != p.b) return b<p.b;  //罚时的升序
		return c<p.c;
	}	
}ps[2000];




int main(){
	int m,  n;
	cin>>m>>n;
	int k=0;
	int score=0;
	char c;
	while(cin>>ps[k].name){
		for(int i=0; i<m; i++){   //依次读入成绩
			cin>>score;
			if(score>0){    //做出来了
				ps[k].a++;  //题目数增加
				ps[k].b+=score;  //罚时
			}
			c=getchar();   
			if(c=='('){   //判断是否有括号,里面有罚时
				cin>>score;
				ps[k].b=ps[k].b+score*n;
				c=getchar(); //消化 )
			}
				
		}
		k++;	
	}
	sort(ps,ps+k);  //排序
	for(int i=0; i<k;i++ ){  //输出
		printf("%-10s ",ps[i].name);
		printf("%2d ",ps[i].a);
		printf("%4d\n",ps[i].b);
	}
	
	
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值