程序设计与算法(一)第10周测验(2019夏季)

001:成绩排序
总时间限制: 1000ms 内存限制: 65536kB
描述
给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。

输入
第一行为n (0 < n < 20),表示班里的学生数目;
接下来的n行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。名字只包含字母且长度不超过20,成绩为一个不大于100的非负整数。
输出
把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项,之间有一个空格。
样例输入
4
Kitty 80
Hanmeimei 90
Joey 92
Tim 28
样例输出
Joey 92
Hanmeimei 90
Kitty 80
Tim 28
来源
习题(14-1)
https://blog.csdn.net/Yang_2002/article/details/80349077

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
int n,i,j;
typedef struct{
	char name[20];
	int mark;
}stu;  
stu student[20];
bool compare(stu a,stu b)
{
	if(a.mark>b.mark)
	{
		return true;
	}
	else
		if(a.mark==b.mark)
		{
			if(strcmp(a.name,b.name)<0)return true;
			else return false;
		}
	else return false;
}
using namespace std;
int main()
{
	//freopen("2.cpp","r",stdin); 
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>student[i].name>>student[i].mark;
	}
	sort(student,student+n,compare);
	for(i=0;i<n;i++)
	{
		cout<<student[i].name<<" "<<student[i].mark<<endl;
	
	}
	return 0;
}

链接中给的提示:
这道题目我用到了C++中的结构体,核心部分需要重点理解
运用到结构体需要#include头文件,并且结构为typedef struct{
}(函数类型);
该题是针对每个单独的学生,所以成绩不需要数组(可能数组写多了习惯也是很迷)
核心部分是这样的
如果前一个同学的成绩大于后一个同学的成绩,根据题目的要求是降序排列,所以不需要调换返回true值(如果compare是int型返回值应该为1)
如果两个同学的成绩相等,则名字字典序小的在前。
所以要对name[20]进行比较,比较字符串的函数为strcmp,存在于#include头文件中。
如果前一个同学的名字字典序小于后一个同学的名字字典序,就不需要排列返回true值(如果compare是int型返回值应该为1)
反之亦然
然后还需要注意输入的时候应该为cin>>student[i].name>>student[i].mark;表示的意思是当前学生的成绩和分数…

002:分数线划定
总时间限制: 1000ms 内存限制: 65536kB
描述
世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。

现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。

输入
第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的志愿者人数。输入数据保证m150%向下取整后小于等于n。
第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000 ≤ k ≤ 9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)。数据保证选手的报名号各不相同。
输出
第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。
从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
样例输入
6 3
1000 90
3239 88
2390 95
7231 84
1005 95
1001 88
样例输出
88 5
1005 95
2390 95
1000 90
1001 88
3239 88
提示
样例说明:m
150% = 3*150% = 4.5,向下取整后为4。保证4个人进入面试的分数线为88,但因为88有重分,所以所有成绩大于等于88的选手都可以进入面试,故最终有5个人进入面试。
来源
NOIP2009复赛 普及组 第二题
https://blog.csdn.net/tigerisland45/article/details/70990434

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define N 5000
 
struct a {
    int no, a;
} a[N];
 
int cmp(const void* p1, const void* p2)
{
    if((*(struct a*)p2).a == (*(struct a*)p1).a)
        return (*(struct a*)p2).no < (*(struct a*)p1).no;
    else
        return (*(struct a*)p2).a > (*(struct a*)p1).a;
}
 
int main(void)
{
    int n, m, i;
 
    scanf("%d%d", &n, &m);
 
    for(i=0; i<n; i++)
        scanf("%d%d", &a[i].no, &a[i].a);
 
    qsort(a, n, sizeof(struct a), cmp);
 
    m = floor(m * 1.5);
    for(i=m; i<n; i++)
        if(a[i].a == a[i-1].a)
            m++;
        else
            break;
 
    printf("%d %d\n", a[m - 1].a, m);
    for(i=0; i<m; i++)
        printf("%d %d\n", a[i].no, a[i].a);
 
    return 0;
}

003:病人排队
总时间限制: 1000ms 内存限制: 65536kB
描述
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:

  1. 老年人(年龄 >= 60岁)比非老年人优先看病。
  2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
  3. 非老年人按登记的先后顺序看病。
    输入
    第1行,输入一个小于100的正整数,表示病人的个数;
    后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
    输出
    按排好的看病顺序输出病人的ID,每行一个。
    样例输入
    5
    021075 40
    004003 15
    010158 67
    021033 75
    102012 30
    样例输出
    021033
    010158
    021075
    004003
    102012
    来源
    习题(14-6)
    https://blog.csdn.net/shanwenkang/article/details/81022610
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
 
string c;
int n;
 
struct point
{
    string id;
    int age;
    int flag;
 
}ans[105],temp[105];
 
bool cmp(point x,point y)
{
    return x.age>y.age;
}
int main()
{
 
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int j;
        c.clear();
        cin>>c>>j;
        ans[i].age=j;
        ans[i].id=c;
        ans[i].flag=0;
    }
 
    int cnt=0;
    for(int i=0;i<n;i++)
    {
        if(ans[i].age>=60)
        {
            temp[cnt].age=ans[i].age;
            temp[cnt++].id=ans[i].id;
            ans[i].flag=1;
        }
 
    }
 
    //sort(temp,temp+cnt,cmp);
 
    for(int i=0;i<cnt;i++)
    {
        for(int j=0;j<cnt-i;j++)
        {
            if(temp[j].age<temp[j+1].age)
            {
                int d=temp[j+1].age;
                string c=temp[j+1].id;
                temp[j+1].age=temp[j].age;
                temp[j+1].id=temp[j].id;
                temp[j].age=d;
                temp[j].id=c;
            }
        }
    }
 
 
    for(int i=0;i<cnt;i++)
    {
        cout<<temp[i].id<<endl;
    }
 
    for(int i=0;i<n;i++)
    {
        if(ans[i].flag!=1)
        {
            cout<<ans[i].id<<endl;
        }
 
    }
 
    return 0;
}

004:mysort
总时间限制: 1000ms 内存限制: 65536kB
描述
程序填空题,自己编写排序函数 mysort,使得其能够对任意类型的数组排序

#include
using namespace std;
struct A {
int nouse1;
int nouse2;
int n;
};
// 在此处补充你的代码
int MyCompare1( const void * e1,const void * e2)
{
int * p1 = (int * ) e1;
int * p2 = (int * ) e2;
return * p1 - * p2;
}
int MyCompare2( const void * e1,const void * e2)
{
int * p1 = (int * ) e1;
int * p2 = (int * ) e2;
if( (* p1 %10) - (* p2 % 10))
return (* p1 %10) - (* p2 % 10);
else
return * p1 - * p2;
}
int MyCompare3( const void * e1,const void * e2)
{
A * p1 = (A*) e1;
A * p2 = (A*) e2;
return p1->n - p2->n;
}
int a[20];
A b[20];
int main ()
{
int n;
while(cin >> n) {
for(int i = 0;i < n; ++i) {
cin >> a[i];
b[i].n = a[i];
}
mysort(a,n,sizeof(int),MyCompare1);
for(int i = 0;i < n; ++i)
cout << a[i] << “,” ;
cout << endl;
mysort(a,n,sizeof(int),MyCompare2);
for(int i = 0;i < n; ++i)
cout << a[i] << “,” ;
cout << endl;
mysort(b,n,sizeof(A),MyCompare3);
for(int i = 0;i < n; ++i)
cout << b[i].n << “,” ;
cout << endl;
}
return 0;
}
输入
多组数据。每组数据以整数 n开头(n<10),然后是n个整数
输出
对每组数据,输出三行。
第一行是整数从小倒大排序的结果
第二行是按个位数从小到大排序的结果(如果个位数相同,小的排在前面)
第三行还是整数从小倒大排序的结果
样例输入
5 21 3 76 48 445
6 73 29 45 8737 2 1
样例输出
3,21,48,76,445,
21,3,445,76,48,
3,21,48,76,445,
1,2,29,45,73,8737,
1,2,73,45,8737,29,
1,2,29,45,73,8737,
来源
Guo Wei
https://blog.csdn.net/d202x/article/details/78041891

void mysort(void *a,int n,int w,int(*f)(const void * e1,const void * e2))
{
 char *s=(char*)a;
 for(int i=0;i<n-1;i++){
  for(int j=i+1;j<n;j++){
   char *p1=(char*)a+i*w;
   char *p2=(char*)a+j*w;
   if(f(p1,p2)>0){
    for(int k=0;k<w;k++){
     char tem=p1[k];
     p1[k]=p2[k];
     p2[k]=tem;
    }
   }
  }
 } 
}

005:从字符串中取数
总时间限制: 1000ms 内存限制: 65536kB
描述
编写GetDoubleFromString函数,该函数可以不断从字符串中取出正浮点数或整数,无数可取,则返回值小于0

#include
#include
using namespace std;
double GetDoubleFromString(char * str)
{
// 在此处补充你的代码
}

int main()
{
char line[300];
while(cin.getline(line,280)) {
double n;
n = GetDoubleFromString(line);
while( n > 0) {
cout << fixed << setprecision(6) << n << endl;
n = GetDoubleFromString(NULL);
}
}
return 0;
}
输入
多组数据,每组数据一行
输出
针对每组数据,将其中的数输出来。每行一个数,保留小数点后面6位。输入数据中只会有正数,不用考虑负号。两个数之间有至少一个非数字非小数点的字符。
样例输入
please 121a1 stand 0.7 9.2 1010.3983 0.00001 black stand what 1324.3
12.34 45 78ab78.34
样例输出
121.000000
1.000000
0.700000
9.200000
1010.398300
0.000010
1324.300000
12.340000
45.000000
78.000000
78.340000
来源
Guo Wei

#include <iostream>
#include <iomanip>
using namespace std;
double GetDoubleFromString(char * str)
{
static char *start;
	if(str)//刚开始start指向str 
		start = str;
	double num = 0;//提取数字 
	while(*start && !(*start >= '0' && *start <= '9'))//跳过非数字 
		++ start;
	if(*start == 0)//遍历完成 
		return -1;
	while(*start >= '0' && *start <= '9')//如果是数字 
	{
		num = num*10 + *start - '0';//将字符转为数字 
		++start;
	}
	if(*start == '.')//小数点后面的数字 
	{
		++start;
		double i = 10;
		while(*start >= '0' && *start <= '9')
		{
			num += (*start - '0')/i;//转化为小数 
			++start;
			i *= 10;
		}
	}
	return num;

}

int main()
{
	char line[300];
	while(cin.getline(line,280)) {
		double n;
		n = GetDoubleFromString(line);
		while( n > 0) {
			cout << fixed << setprecision(6) << n << endl;
			n = GetDoubleFromString(NULL);
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值