题意

  • 一个学生的成绩由上机,期中,期末共3部分构成,现要求找出有资格获得证书的同学们。
  • 证书获得者要求:上机分至少200,最终成绩及格。
  • 最终成绩的生成规则:若期中分>期末分,则f = 期中 * 0.4 + 期末 * 0.6。否则期末分就是最终成绩。
  • 注,学生某项成绩可能会缺失。

分析

  • 学生人数可能达到3W,别以为只是1W! P+M+N<=30000。略坑,搞得我老段错误。
  • 学生可能没有分数,这得处理,分析期中和期末的情况即可。
  • 学生的最终成绩计算公式涉及浮点,直接round解决(其实题意round up 应该是上整的意思)。
  • 规则应该是没有冲突的。
#include <iostream>
#include <vector>
#include <map>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std; struct Student
{
string name;
int p, m, n, f;
Student(string name=""): name(name), p(-1), m(-1), n(-1), f(-1){};
};
map<string,int> mapp;
vector<Student> students; void TestAndSet(string name)
{
if(mapp.find(name)==mapp.end())
{
mapp[name] = students.size();
students.push_back(Student(name));
}
} int cmp(int a, int b)
{
if(students[a].f==students[b].f)
return students[a].name < students[b].name;
return students[a].f > students[b].f;
} int main()
{
//freopen("input.txt", "r", stdin);
int P,M,N;
while(cin>>P>>M>>N)
{
mapp.clear();
string name;
char buf[32];
int score; while(P--)
{
scanf("%s%d", buf, &score);
name = buf;
TestAndSet(name);
students[mapp[name]].p = score;
}
while(M--)
{
scanf("%s%d", buf, &score);
name = buf;
TestAndSet(name);
students[mapp[name]].m = score;
}
while(N--)
{
scanf("%s%d", buf, &score);
name = buf;
TestAndSet(name);
students[mapp[name]].n = score;
}
vector<int> vect;
for(int i=0; i<students.size(); i++)
{
if(students[i].p<200) continue; // 上机分数低
else if(students[i].n<0) continue; // 无期末分数
else
{
if(students[i].m<=students[i].n)
students[i].f = students[i].n;
else
students[i].f = round(students[i].m * 0.4 + students[i].n * 0.6);
if(students[i].f>59) vect.push_back(i);
}
}
sort(vect.begin(), vect.end(), cmp);
for(int i=0; i<vect.size(); i++)
{
// 名字 上机 期中 期末 总分
Student tmp = students[vect[i]];
printf("%s %d %d %d %d\n",
tmp.name.c_str(), tmp.p, tmp.m, tmp.n, tmp.f);
}
}
return 0;
}

最新文章

  1. 轮播图适应代码jQ
  2. 安装PyMysql的基本步骤
  3. iOS开发之静态库(六)—— 时空之争
  4. Linux修改系统以及pip更新源
  5. 在Assertion中获取Response的headers,获取headers中信息,获取body(content)
  6. hdoj (1162) 最小生成树
  7. Android 启动过程的底层实现
  8. WeakHashMap和Java引用类型详细解析
  9. Tsinsen-A1489 抽奖 【数学期望】
  10. 神经网络NN
  11. Noip2016组合数(数论)
  12. React Native:真机断点调试+跨域资源加载出错问题解决
  13. 2018-09-15 Java源码英翻中库以及服务原型
  14. NodeJS基础(二)
  15. 阿里巴巴 Weex
  16. Day12 (黑客成长日记) 函数
  17. C#多线程编程のSemaphore(信号量,负责协调各个线程)
  18. node.js中的文件系统
  19. 一定要知道的,那些Linux操作命令
  20. React文档(十三)思考React

热门文章

  1. js 多张爆炸效果轮播图
  2. mysql 备份时间 %date~0,4%和 %time~0,2%等用法详解
  3. Ubuntu server 修改系统时区
  4. JS匿名函数以及arguments.callee的调用
  5. Sublime Text 3 3126 安装+注册码
  6. oracle Clob类型转换成String类型
  7. 读书笔记 - 《黑旗 ISIS的崛起》
  8. python中字典排序,列表中的字典排序
  9. Why Nexiq 125032 USB Link Truck diagnostic tool is so helpful ?
  10. my.助战选择