本文主要是介绍每日一题 『谁在说谎,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
L1 - 7 『谁在说谎』
分数 20
全屏浏览题目
切换布局
作者 JMU_ACM
单位 集美大学
- 贝贝(并不)是一个“知乎迷”
- 于是贝贝今天打开知乎,就刷到了以下的内容
- 贝贝恍然大悟,直接跟同学们讨论成绩的时候,大家都为了照顾最弱的贝贝,故意将各自的成绩报低了好几十分,为的就是照顾贝贝的感受,只有贝贝自己考的是真的低。
- 贝贝瞅了瞅自己68分的成绩单,一时间接受不了这个事实。
- 所以,贝贝此时打算揪出有谁在谎报成绩
- 于是贝贝从老师那边搞来了n个人(不包括贝贝的,因为贝贝本来就知道自己的成绩)前m次的真实考试成绩,并且通过水群得到了这n个人在群里面讨论时候报出的这次考试的成绩。
- 但是贝贝是个很笨的孩子,看不出有谁可能说谎,于是他就找到了一个神犇(也就是你),让你帮忙找出有谁可能说谎。
- 设贝贝前n次考试的平均成绩为x0,这次考试的成绩为y0,某个人的前n次考试成绩的平均值为xi,这次考试报出的成绩为yi。如果他之前的平均成绩比贝贝高或等于贝贝,这次考试报的成绩比贝贝低,即xi≥x0,且yi<y0,那么他就有可能在说谎。
- 本题要求你按字典序从小到大输出有可能说谎的人的姓名。
输入格式:
第一行,输入正整数n和m,其含义同题意中的。
第二行,包含m个整数,代表贝贝前m次考试的真实成绩。
接下来的n行,对于第i行给定一个字符串S
和m个整数,代表编号为i的人姓名为S
,前m次考试的成绩。
最后一行,给定n+1个整数,分别为a0到an,其中a0代表贝贝本次考试的真实成绩,ai代表编号为i的人报出的本次考试成绩。
输出格式:
输出可能说谎的人的姓名,每个姓名占一行。如果没有人可能说谎则输出Yeah! Nobody!
。
输入样例:
4 3
68 68 68
WDW 100 100 99
HX 99 100 100
LBN 68 68 68
JXJ 100 100 99
68 67 65 68 60
输出样例:
HX
JXJ
WDW
Hint
对于本题100%的数据,1≤n≤20,1≤m≤105,S的长度在[1,5]之间,且仅由英文字母组成,且保证n个人中没有重复名字。
因为大家可能会参加不同的满分制的比赛与考试,故题目中所有的单个成绩的范围都在[0,105]之间。特别的,考虑到贝贝是个菜狗,分数可能因为自身太菜被改卷老师扣成负数,故贝贝的单个成绩范围在[−105,105].
题目虽然很长,但是看完题目,我们提取到的重要信息就是要知道每个人的名字,和他们的之前考试的平均成绩,还有当前考试的成绩 那么非常显然就需要用到结构体,来记录每个人的信息:
typedef struct node{string name;double oldgrade;double newgrade;
}stu;
其中贝贝的成绩可以单独处理,不需要放入结构体当中
记录其他人的成绩:
for(int i = 0;i<n;i++){cin>>tempname;temp = 0;for(int j = 0;j<m;j++){cin>>x;temp+=x;}stus[i].name = tempname;stus[i].oldgrade = (1.0*temp)/m;}
然后读取贝贝的成绩,和其他人的成绩
int jay;//贝贝这次考试成绩cin>>jay;for(int i = 0;i<m;i++) {cin>>stus[i].newgrade;}
然后顶一个一个string的vector数组,来存放满足题目需要条件的人
vector<string> re;for(int i = 0;i<n;i++){if(stus[i].oldgrade>=BGrade&&stus[i].newgrade<jay)re.push_back(stus[i].name);}
因为题目要求需要升序,所以我们可以直接使用vectoer自带的sort函数,sort默认是升序,所以直接用就可以,然后输出就可以:
sort(re.begin(),re.end());if(re.empty()) cout<<"Yeah! Nobody!";for(int i = 0;i<re.size();i++)cout<<re[i]<<endl;
整体代码实现:
#include<bits/stdc++.h>
using namespace std;
typedef struct node{string name;double oldgrade;double newgrade;
}stu;
int main()
{int n,m;cin>>n>>m;string tempname;double BGrade = 0,temp = 0;stu stus[n];int x;for(int i = 0;i<m;i++){cin>>x;BGrade+=x;}BGrade = 1.0*BGrade/m;for(int i = 0;i<n;i++){cin>>tempname;temp = 0;for(int j = 0;j<m;j++){cin>>x;temp+=x;}stus[i].name = tempname;stus[i].oldgrade = (1.0*temp)/m;}int jay;cin>>jay;for(int i = 0;i<m;i++) {cin>>stus[i].newgrade;}vector<string> re;for(int i = 0;i<n;i++){if(stus[i].oldgrade>=BGrade&&stus[i].newgrade<jay)re.push_back(stus[i].name);}sort(re.begin(),re.end());if(re.empty()) cout<<"Yeah! Nobody!";for(int i = 0;i<re.size();i++)cout<<re[i]<<endl;return 0;
}
这篇关于每日一题 『谁在说谎的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!