HDU-2093 考试排名 最强最细题解 c++版

这道题看着吓人,说明一堆,结果就是个结构体排序,其他啥都没了

忘了具体描述的这有题目链接:题目链接

看着数据有点多,千万不要整一堆没用数组啥玩意的,不要被忽悠了,毕竟那有多少人数都不确定

我的思路就是使用while输入姓名(C语言使用EOF),然后循环输入每个题目对应的数据项,变输入变处理,存入到结构体中,输入截止数据处理保存到结构体的过程也就完了,然后再使用sort排序,这里当然需要自定义排序,自定义排序函数如下:

bool compare(student a,student b){
	if(a.num==b.num&&a.time==b.time)
		return  a.name<b.name;
	else
		if(a.num==b.num)
			return a.time<b.time;
		else
			return a.num>b.num;
}

C语言的话直接手写一个sort排序函数就OK,过程也不难,就是稍微代码量会增大,没有c++这么少

最后就是数据处理方面问题了,名字占10个字符,我就直接在开始输入后让不够10个的直接添加空格,当然不可能超过10个的,这个不用考虑,处理部分代码如下:

		int k=10-s.length();
		while(k--)
			s.append(" ");
		stu[numstu].name=s;  //处理完成后直接赋值给结构体对应位置

输入对应题目数据项处理方式也很简单,输入为字符串,因为有的包含 () ,为负数或者0的当然就没有AC,就不做处理,AC的只需要需要就可以解决,将字符串转化为整数即可,碰到’('就直接读取里面的整数就OK,部分代码如下:

int num=n;
		while(num--){
			string score;
			cin >> score;
			if(score.find('-')!=-1||score.compare("0")==0)
				continue;
			stu[numstu].num++;
			int time=0;  //读取时间
			int fatime=0; //错误次数,即括号里面数据
			for(int i=0;i<score.length();i++){
				if(score[i]>='0'&&score[i]<='9')
					time=time*10+score[i]-48;
				if(score[i]=='('){
					for(int j=i+1;j<score.length()-1;j++){ 
						fatime=fatime*10+score[j]-48;
					}
					break; 
				}
			}	
			stu[numstu].time+=time+fatime*m;   //通过时间+错误次数*每次罚时=总时间
		}

最后就是输出时对的题数和总时间需要的字符数,长度短就直接在输出再处理了,当然两个数据中间还有一个空格不能忘,代码如下:

for(int i=0;i<numstu;i++){
		cout << stu[i].name << " ";
		if(stu[i].num<10)
			cout << " ";
		cout << stu[i].num << " ";
		if(stu[i].time<10)
			cout << "   ";
		else if(stu[i].time<100)
			cout<< "  ";
		else if(stu[i].time<1000)
			cout<< " ";
		cout << stu[i].time << endl; 
	} 

最后,上AC代码:

#include<iostream>
#include<string>
#include<cmath>
#include<sstream> 
#include<iomanip>
#include<algorithm>
using namespace std;

struct student{
	string name;
	int num;
	int time;
	
};

bool compare(student a,student b){
	if(a.num==b.num&&a.time==b.time)
		return  a.name<b.name;
	else
		if(a.num==b.num)
			return a.time<b.time;
		else
			return a.num>b.num;
}
int main()
{
	student stu[10005];
 	int n,m,numstu=0;
 	cin >> n >>m;
 	string s;
 	getchar();
   	while(cin>>s){
		int k=10-s.length();
		while(k--)
			s.append(" ");
		stu[numstu].name=s;
		stu[numstu].num=0;
		stu[numstu].time=0;
		int num=n;
		while(num--){
			string score;
			cin >> score;
			if(score.find('-')!=-1||score.compare("0")==0)
				continue;
			stu[numstu].num++;
			int time=0;
			int fatime=0;
			for(int i=0;i<score.length();i++){
				if(score[i]>='0'&&score[i]<='9')
					time=time*10+score[i]-48;
				if(score[i]=='('){
					for(int j=i+1;j<score.length()-1;j++){
						fatime=fatime*10+score[j]-48;
					}
					break;
				}
			}	
			stu[numstu].time+=time+fatime*m; 
		}
		numstu++; 
	}
	sort(stu,stu+numstu,compare);
	for(int i=0;i<numstu;i++){
		cout << stu[i].name << " ";
		if(stu[i].num<10)
			cout << " ";
		cout << stu[i].num << " ";
		if(stu[i].time<10)
			cout << "   ";
		else if(stu[i].time<100)
			cout<< "  ";
		else if(stu[i].time<1000)
			cout<< " ";
		cout << stu[i].time << endl; 
	} 
   return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值