又是一道英语阅读模拟,规则读的半死。。蛋疼
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
#include<deque>
using namespace std;
namespace
{
struct Student
{
deque<int> q;
int bonus, abs;
double avg, adjAvg;
int grade;
};
void grade(Student *s, double mean, double sd)
{
if (s->adjAvg >= mean + sd)
s->grade = 4;
else if (s->adjAvg >= mean)
s->grade = 3;
else if (s->adjAvg >= (mean - sd))
s->grade = 2;
else
s->grade = 1;
}
void adj_grade(Student *s)
{
s->grade -= s->abs / 4;
if (s->grade < 0)
s->grade = 0;
if (s->abs == 0 && s->grade < 4)
s->grade++;
}
}
int main()
{
puts("MAKING THE GRADE OUTPUT");
int N, S, T;
scanf("%d", &N);
vector<Student *> V;
while (N--)
{
scanf("%d %d", &S, &T);
V.clear();
double total = 0;
for (int i = 0; i < S; i++)
{
Student *stu = new Student();
int score, sum = 0;
for (int j = 0; j < T; j++)
{
scanf("%d", &score);
stu->q.push_back(score);
sum += score;
}
if (T > 2)
{
sort(stu->q.begin(), stu->q.end());
sum -= stu->q.front();
stu->q.pop_front();
}
stu->avg = sum * 1.0 / stu->q.size();
total += stu->avg;
scanf("%d %d", &(stu->bonus), &(stu->abs));
stu->adjAvg = stu->avg + (stu->bonus) / 2 * 3;
V.push_back(stu);
}
double mean = total / S;
total = 0;
for (size_t i = 0; i < V.size(); i++)
total += (V[i]->avg - mean) * (V[i]->avg - mean);
double sd = sqrt(total / S);
if (sd < 1)
sd = 1;
double res = 0;
for (size_t i = 0; i < V.size(); i++)
{
grade(V[i], mean, sd);
adj_grade(V[i]);
res += V[i]->grade;
}
printf("%.1lf\n", res / V.size());
}
puts("END OF OUTPUT");
return 0;
}