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的更多相关文章
随机推荐
- 321B
MCMF必须是满足流量最大为前提下的最小费用流(这里是最大费用流) 因此还必须不断地枚举m的流量才行 #include<iostream> #include<algorithm> ...
- Java 类型转换(int->String)
1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...
- spring boot http2
项目已启动的情况下,启动单元测试报端口has binded 可以使用server.port=-1 禁用端口绑定来启动单元测试 https://docs.spring.io/spring-boot/do ...
- 1.centos7 安装zookeeper
1.安装jdk 1)查找jdk包: yum search java|grep jdk 2)安装: yum install -y java-1.8.0-openjdk.x86_64 2. 安装ZooKe ...
- 经典网络LeNet5看卷积神经网络各层的维度变化
本文介绍以下几个CNN经典模型:Lenet(1986年).Alexnet(2012年).GoogleNet(2014年).VGG(2014年).Deep Residual Learning(2015年 ...
- Jenkins安装过程
1.安装环境 配置java环境 安装Tomcat 2.将Jenkins.war 包放入Tomcat的webapps目录 3.启动tomcat后,tomcat会解压war包,生成一个jenkins文件夹 ...
- 【ACM】阶乘因式分解(二)
阶乘因式分解(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 给定两个数n,m,其中m是一个素数. 将n(0<=n<=2^31)的阶乘分解质因数,求 ...
- execlp启动android进程命令
execlp启动Android界面或service/广播参数设置 -n代表打开组件-d代表 data-a代表action 打开网页 调用am命令 if (sdkVersion >= 17) { ...
- Android NDK开发 Jni中Debug(三)
下载LLDB 配置Android Native - Debugger 调式结果如下 #include <jni.h> #include <string.h> #include& ...
- 多个ajax请求时控制执行顺序或全部执行后的操作
1.当确保执行顺序时 (1)请求加async: false,,这样所有的ajax就会同步执行,请求顺序就是代码顺序: (2)$.when 确保所有异步的ajax请求完毕时 $.when($.aja ...