Problem F: 来算一下自己的成绩吧!
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1113 Solved: 442
[ Submit][ Status][ Web Board]
Description
OJ是一个同学们又爱又恨的东东。老师在OJ上布置了作业,并且把作业成绩作为实验课程的成绩。马上就要结课了,小明想知道自己到底能得到多少分,所以他向老师请教分数的计算方法。老师告诉他,分数是这么算滴:
1. 对于某次作业,假设所有同学中Accpted题目数最多为X,小明Accpted题目数为Y,那么这次作业小明得分100Y/X。
2. 如果小明不幸错过了某次作业或者没有题目被Accpted,那么为0分。
3. 最终成绩是所有作业成绩的平均分。
好了,小明从OJ上下载了所有的standing,发现要想计算成绩还是挺麻烦的。所以,他向你求助,请你帮忙编个程序,算算分数。
Input
第1行N>0,表示本年级、本专业的学生数。
之后N行,每行是一个不含空白符的字符串,是一个学生的名字(假定没有重名,且姓名最多有10个字符)。
接着是M>0,表示老师总共布置的作业次数。
每次作业的输入中,第1行K>0,表示这次作业的standing中有提交记录的学生人数。之后K行是K个学生的姓名及其Accpted的题目数。
Output
第1行输出:NAME TEST1 TEST2 TEST3 ...... FINAL。
其中,“TEST?”的个数等于作业次数,按照顺序依次输出,如上所示。
之后根据输入的专业学生姓名顺序,依次输出所有学生的每次作业成绩以及最终成绩。
所有输出左对齐。
成绩保留2位小数,且左对齐输出。
输出的每一列的第1个字符要对齐。
见样例。
Sample Input
Sample Output
HINT
Append Code
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<iomanip>
using namespace std;
class Test
{
private:
map<string,double> m;
public:
void input(int k)
{
string n;
double num;
double ma=0;
while(k--)
{
cin>>n>>num;
if(num>ma)
ma=num;
m.insert(make_pair(n,num));
}
m.insert(make_pair("max",ma));
}
void score()
{
map<string,double>::iterator it;
double ma;
for(it=m.begin(); it!=m.end(); it++)
{
if(it->first=="max")
ma=it->second;
}
for(it=m.begin(); it!=m.end(); it++)
{
it->second=100*(it->second)/ma;
}
}
void out(string n)
{
map<string,double>::iterator it;
int flag=0;
for(it=m.begin(); it!=m.end(); it++)
{
if(it->first==n)
{
cout<<setiosflags(ios::left)<<setw(7)<<setprecision(2)<<fixed<<it->second;
flag=1;
}
}
if(flag==0)
cout<<setiosflags(ios::left)<<setw(7)<<setprecision(2)<<fixed<<0.0;
}
double ttt(string n)
{
map<string,double>::iterator it;
for(it=m.begin(); it!=m.end(); it++)
{
if(it->first==n)
return it->second;
}
return 0;
}
};
int main()
{
vector<string> name;
string s;
int n;
cin>>n;
for(int j=0; j<n; j++)
{
cin>>s;
name.push_back(s);
}
int m;
cin>>m;
Test test[m];
for(int i=0; i<m; i++)
{
int k;
cin>>k;
test[i].input(k);
test[i].score();
}
cout<<"NAME ";
for(int i=1;i<=m;i++)
cout<<"TEST"<<setiosflags(ios::left)<<setw(3)<<i;
cout<<"FINAL"<<endl;
for(int i=0; i<n; i++)
{
double sum=0;
cout<<setiosflags(ios::left)<<setw(12)<<name[i];
for(int j=0; j<m; j++)
{
test[j].out(name[i]);
sum+=test[j].ttt(name[i]);
}
cout<<setiosflags(ios::left)<<setw(6)<<setprecision(2)<<fixed<<sum/m<<endl;
}
}