zoukankan      html  css  js  c++  java
  • 【模拟】Class 解题报告

    【问题描述】

    信息班这期的课将要结束了,老师要从现在班上的同学中选出比较优秀的同学进入下一期的学习。而录取标准则是将平时作业和考试一起考虑,综合成绩排在前面的则录取。经过一番思考,老师作了以下的筛选计划:

    1. 设计两个参数x,y,学生总成绩为平时成绩的x%和考试成绩的y%。
    2. 将同学按总成绩排名,招收总成绩在前15的学生,不够15则全部录取。


    注:总成绩在第15的如果有多人,则可以被同时录取。

    例如:18个人总成绩从大到小依次为95,93,93,88,87,84,80,75,70,68,66,65,60,58,57,57,56,55。那么93,93同为第2名,而88为第4名,57,57同为第15名,都被录取。而56,55则不被录取。

    老师因为招生培训的事情很忙,所以现在她把信息班学生的成绩表给了你,希望你能告诉她哪些同学被录取了。

    【输入】

    输入文件class.in
    第一行有三个数N,x,y。表示信息班有N个同学以及参数x,y。
    第二行N个数,分别为A1,A2,A3 … AN。Ai表示编号为i的同学的平时成绩。
    第三行N个数,分别为B1,B2,B3 … BN。Bi表示编号为i的同学的考试成绩。

    【输出】

    输出文件class.out
    共一行,为被录取同学的编号,按照升序输出。

    【输入样例】

    18 50 50
    0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34
    35 33 31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1

    【输出样例】

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

    【数据说明】

    1<=N<=100
    0<=x,y<=100
    0<=平时成绩,考试成绩<=100
    以上数据皆为整数

    分析:简单的结构数据,比较简单的模拟,但是我居然WA了!考试的时候只有90分,因为在处理名次的时候有一个比较常识的地方(可是我不知道),第一名如果有两人并列的话,第三个人是第三名而不是第二名!因为这个细节没有处理好所以最后一个点没有过。另外在处理分数的时候可以避开小数处理,直接乘x,y,这样可以避免小数误差降低编程复杂度。总之简单的模拟题,送分的。下面是AC代码。

    /*
    ID: ringxu97
    LANG: C++
    TASK: class
    SOLUTION: 模拟
    */
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<vector>
    #include<stack>
    #include<queue>
    using namespace std;
    const int maxn=100+10;
    int n,x,y;
    struct STU//A,B表示两次的分数,mark表示总分,num表示序号
    {
    	int A,B;
    	int mark;
    	int num;
    	void calc(){mark=A*x+B*y;}
    }s[maxn];
    bool operator < (STU a,STU b)
    {
    	if(a.mark==b.mark)return a.num<b.num;
    	return a.mark>b.mark;
    }
    bool hash[maxn];
    void read()
    {
    	scanf("%d%d%d",&n,&x,&y);
    	for(int i=1;i<=n;++i)
    	{
    		scanf("%d",&s[i].A);
    		s[i].num=i;
    	}
    	for(int i=1;i<=n;++i)
    	{
    		scanf("%d",&s[i].B);
    		s[i].calc();
    		//printf("%d mark:%d
    ",i,s[i].mark);
    	}
    }
    int M;
    void solve()
    {
    	s[0].num=s[0].mark=-1;
    	memset(hash,0,sizeof(hash));
    	sort(s+1,s+1+n);
    	for(M=1;M<=15;++M)hash[s[M].num]=1;
    	for(M=16;M<=n;++M)
    	{
    		if(s[M].mark!=s[M-1].mark)break;
    		//printf("%4d mark:%4d cnt:%4d
    ",s[i].num,s[i].mark,cnt);
    		hash[s[M].num]=1;
    	}
    }
    void print()
    {
    	int res[maxn];
    	int *p=res;
    	for(int i=1;i<=n;++i)if(hash[i])*(p++)=i;
    	for(int *i=res;i<p-1;++i)printf("%d ",*i);
    	printf("%d
    ",*(p-1));
    }
    int main()
    {
        freopen("class.in", "r", stdin);
        freopen("class.out", "w", stdout);
        read();//读入数据
        solve();//排序
        print();//出结果
    	return 0;
    }
  • 相关阅读:
    微信小程序(八)项目实例(原生框架 MINA转云开发)==03云开发数据库
    微信小程序(七)项目实例(原生框架 MINA转云开发)==02云开发配置
    TERSUS无代码开发(笔记01)按装下载和基础语法
    微信小程序(二十)UI组件(Vant Weapp)02使用
    TERSUS无代码开发(笔记03)常用快捷键
    局域网内别人的电脑无法访问我的电脑(共享打印机)
    基于单片机的电子密码锁的实现
    51单片机红外控制解码详解
    基于51单片机、串口通信、ASP.NET的密码锁系统
    MySql For Mac 安装和基本操作
  • 原文地址:https://www.cnblogs.com/ringxu97/p/class2.html
Copyright © 2011-2022 走看看