PAT1137
题意
- 一个学生的成绩由上机,期中,期末共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;
}
PAT1137的更多相关文章
随机推荐
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_值类型的装箱和拆箱(二)
[注意]:如果知道自己写的代码会造成编译器反复对一个值类型进行装箱,请改成用手动方式对值类型进行装箱. [好处]:代码会变得更小.更快. [例子]: using System; public seal ...
- 洛谷1541(多维dp)
走格子拿分数,直接弄dp[i]是到了第i格的最大得分可以发现是假的. 于是此题设f[i][j][k][t]代表四种步伐各用了几次可以得到的最大得分,到达的点可以直接算出来,就好转移了. const i ...
- 江西财经大学第一届程序设计竞赛 C
链接:https://www.nowcoder.com/acm/contest/115/C来源:牛客网 题目描述 决赛圈还剩下两个人,“伏地魔”XDD和跑毒进圈的FZL,XDD拿着狙击枪AWM瞄准并准 ...
- newSingleThreadExecutor单任务线程池使用
1.newSingleThreadExecutor单任务线程池, 一次只执行一个任务 package ThreadTest; import java.util.concurrent.Executo ...
- WAF攻防实战
摘要 本文主要分为四个部分,一.首先对WAF做了简单的介绍,让读者对WAF这类产品有一个大概的了解:二.这部分通过一个实例演示了如何利用WAF为其后端的Web应用提供安全防护功能:三.安全是相对的,世 ...
- 通过JS,按照原比例控制图片尺寸
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Con ...
- linux 命令(Ubuntu)
1. 我们可以使用下列的命令压缩一个目录: # zip -r archive_name.zip directory_to_compress 2. 下面是如果解压一个zip文档: # unzip arc ...
- JavaSE---内部类
1.概述 1.1 内部类:一个类定义在其他类的内部,这个类被称为内部类: 1.1.1 内部类可以放在外部类的任何位置,方法中也可以(称为局部内部类): 1.1.2 一般将内部类作为 成员内部类 使用 ...
- public class 与 class 的区别
public class 与 class 的区别 1.一个类前面的public是可有可无的 2.如果一个类使用 public 修饰,则文件名必须与类名一致 3.如果一个类前面没有使用public修饰, ...
- 智能时代的到来,企业APP给企业带来的好处
智能手机的出现给大家带来了巨大的便捷,无论是,文字沟通,购物点餐,开车导航,查看信息,生活服务,上下班打卡,交付各种费用,娱乐生活等都可以在一部小小的手机上来实现.随着智能手机的不断更新,越来越多的软 ...