一日一题:第六题---成绩统计&单词分析

​作者:小妮无语
专栏:一日一题
‍♀️✌️道阻且长,不要放弃✌️‍♀️

​今天主要发现两个很好用的结构,想做个记录

目录

    • 1.成绩统计
    • 代码
    • 2.单词分析
    • 代码

1.成绩统计

题目描述·
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。

请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。

输入格式

第一行包含整数 N,表示操作数量。

接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。

输出格式
输入的第一行包含一个整数 n .(1≤n≤10^4 ),表示考试人数。接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
输出描述
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数

输入样例:

7
80
92
56
74
88
100
0

输出样例:

71%
43%

代码

#include 
using namespace std;
int n,n1,n2;
int main()
{
  // 请在此输入您的代码
  cin>>n;
  int a=n;
  while(a--)
  {
    int x;
    scanf("%d",&x);
    // cout<
    if(x>=60) n1++;
    if(x>=85) 
    {
      n2++;
      // cout<
    }
  }
   int m1=float((n1+0.0)/(n+0.0))*100+0.5;
  int m2=float((n2+0.0)/(n+0.0))*100+0.5;
  // int m1=float((n1+0.0)/(n+0.0))*1000;
  // int m2=float((n2+0.0)/(n+0.0))*1000;
  // if(m1%10>=5) m1=m1/10+1;
  // else m1=m1/10;
  // if(m2%10>=5) m2=m2/10+1;
  // else m2=m2/10;
  printf("%d%\n%d%",m1,m2);
  return 0;
}

错误点

  1. 第一次写的只通过了四个数据,我又读题发现了“百分号前的部分 四舍五入保留整数”,如果直接除就下取整了
    第一次修改我添加了判断,以为及格和优秀率一定是小于1的所以要求百分比就要乘以100,现在要判断第三问是否可以进一(这里我没有考虑第四位进一的情况,但是还是通过了),所以我称了1000,然后取余看个位是否大于等于5便可以进一,然后再除10
  2. 我直接拿两个整数相除(n1/1<1)就直接归 0了,所以一定要给其中一个加个小数点,或者提前转换为浮点数,这里我选择了加(0.0)
    知识点
    当这个数的可以五入,呢加 0.5,就直接进一了
    如果这个数要舍弃,呢加上 0.5,也无济于事!!(看题解大佬写的,今天又学到了!)

2.单词分析

题目描述·
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。

输入格式
输入一行包含一个单词,单词只由小写英文字母组成。

对于所有的评测用例,输入的单词长度不超过 1000。
输出格式
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个

第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
输入样例:

longlonglongistoolong

输出样例:

o
6

代码

#include 
#include
using namespace std;
int temp[30];
string s;
int m,l;
int main()
{
  // 请在此输入您的代码
  cin>>s;
  // cout<
  for(int i=0;i<s.size();i++)
  {
    int x=s[i]-'a';
    // cout<
    temp[x]++;
  }
  char r;
  for(int i=0;i<26;i++)
  {
    if(temp[i]>m)
    {
      m=temp[i];
      r=char(i+'a');
    }
  }
  
  cout<<r<<endl;
  // printf("%s\n",r);
  printf("%d",m);
  return 0;
}

错误点:刚开始没看到字典序最小,哭了,只过了几个数据,我还在好奇为撒?刚开始我还在想用不用map什么的,我一看题目说的只有小写字母,呢开辟不了不了多少数组,但是我还是很好奇map可不可以写这个题,等过几天研究一下,今天累了。
知识点
字典序的概念,我的认识,谁在字典的排序最靠前谁的字典序最小
1 2 3 , 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 , 3 2 1
拿这个例子,上面便是字典序从小到大,排序的全排列
所以这个题的意思,如果最大的次数有好几个字母,呢么就按照字母表排顺序,谁在前面谁的字典序就小,所以刚开始,我在第一个for循环就想记录最大值和字母,没有考虑字典序,正确做法,等统计完所有字母出现的次数,然后遍历一遍、取最大次数的第一次出现的字母

欢迎来到一日一题的小菜鸟频道,睡不着就看看吧!
一日一题:第六题---成绩统计&单词分析_第1张图片

你可能感兴趣的:(一日一题,算法,c++,图论)