这道题看着吓人,说明一堆,结果就是个结构体排序,其他啥都没了
忘了具体描述的这有题目链接:题目链接
看着数据有点多,千万不要整一堆没用数组啥玩意的,不要被忽悠了,毕竟那有多少人数都不确定
我的思路就是使用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;
}