第十周练习

7615 成绩排序 http://noi.openjudge.cn/ch0110/03/
7914 分数线划定 http://noi.openjudge.cn/ch0110/05/
7618 病人排队 http://noi.openjudge.cn/ch0110/08/
10420 mysort http://cxsjsxmooc.openjudge.cn/2016hw10/4/
10421 从字符串中取数  http://cxsjsxmooc.openjudge.cn/2016hw10/5/

03:成绩排序

描述

给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。

输入

第一行为n (0 < n < 20),表示班里的学生数目;
接下来的n行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。名字只包含字母且长度不超过20,成绩为一个不大于100的非负整数。

输出

把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项,之间有一个空格。

样例输入

4
Kitty 80
Hanmeimei 90
Joey 92
Tim 28

样例输出

Joey 92
Hanmeimei 90 
Kitty 80
Tim 28
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct Student{
	char c[30];
	int a;
}; 

Student stu[30];
bool cmp1(Student x, Student y)
{
	if(x.a == y.a)
		return strcmp(x.c,y.c) < 0;//注意不能用x.c < y.c,这样就只能比较第一个字符的大小 
	else
		return x.a > y.a;
} 

int main()
{
	int n;
	cin >> n;
	for(int i = 1; i <= n; ++i)
	{
		cin >> stu[i].c >> stu[i].a;
	}
	sort(stu+1,stu+1+n,cmp1);
	for(int i = 1; i <= n; ++ i)
	{
		cout << stu[i].c << " " << stu[i].a << endl;
	}
	return 0;
}

 05:分数线划定

描述

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

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

输入

第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的志愿者人数。输入数据保证m*150%向下取整后小于等于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个人进入面试。

#include<iostream>
#include<algorithm>
#define MAXN 5010
using namespace std;

struct Worker{
	int number;
	int score;
};

Worker a[MAXN];

bool cmp(Worker x, Worker y)
{
	if(x.score == y.score)
		return x.number < y.number;
	else
		return x.score > y.score;
} 

int main()
{
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= n; ++ i)
	{
		cin >> a[i].number >> a[i].score;
	}
	sort(a+1, a+1+n, cmp);
	int k = m*1.5;//int 和 floor()一样都是向下取整 
	while(a[k].score == a[k+1].score)//碰到分数一样的要输出 
	{
		++k;
	}
	cout << a[k].score << " " << k << endl;
	for(int i = 1; i <= k; ++ i)
	{
		cout << a[i].number << " " << a[i].score << endl;
	}
	return 0;
}

08:病人排队

描述

病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序: 
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
#include<iostream>
#include<algorithm>
#include<cstring>
#define MAXN 110
using namespace std;

struct Patient{
	char ID[15];
	int age;
	int number;//登记的顺序 
};

Patient a[MAXN];

bool cmp1(Patient x, Patient y)//大于等于60岁
{
	if(x.age == y.age)
		return x.number < y.number;
	else
		return x.age > y.age;
}

bool cmp2(Patient x, Patient y)//小于60岁
{
	return x.number < y.number;
}
int main()
{
	int n;
	cin >> n;
	for(int i =1; i <= n; ++ i)
	{
		cin >> a[i].ID >> a[i].age;
		a[i].number = i;
	}
	sort(a+1, a+1+n, cmp1);
	for(int i = 1; i <= n; ++ i)
	{
		if(a[i].age >= 60)
			cout << a[i].ID << endl;
	} 
	sort(a+1, a+1+n, cmp2);
	for(int i = 1; i <= n; ++ i)
	{
		if(a[i].age < 60)
			cout << a[i].ID << endl;
	} 	
	return 0;
}

解法2:

#include<iostream>
#include<algorithm>
#include<cstring>
#define MAXN 110
using namespace std;

struct Patient{
	char ID[15];
	int age;
	int number;//登记的顺序 
};

Patient a[MAXN];

bool cmp(Patient x, Patient y)
{
	if(x.age >= 60 && y.age >= 60)
	{
		if(x.age == y.age)//序号从小到大
			return x.number < y.number;
		else
			return x.age > y.age;
	 } 
	 else if(x.age >= 60 && y.age < 60)
	 {
	 	return x.age > y.age;//年龄从大到小
	 }
	 else if(x.age < 60 && y.age >=60)
	 {
	 	return x.age > y.age;//年龄从大到小,注意不要写成小于符号了
	 }
	 else 
	 	return x.number < y.number;
}

int main()
{
	int n;
	cin >> n;
	for(int i =1; i <= n; ++ i)
	{
		cin >> a[i].ID >> a[i].age;
		a[i].number = i;
	}
	sort(a+1, a+1+n, cmp);
//	for(int i = 1; i <= n; ++ i)
//	{
	//	if(a[i].age >= 60)
		//	cout << a[i].ID << endl;
//	} 
	for(int i = 1; i <= n; ++ i)
	{
		//if(a[i].age < 60)
		cout << a[i].ID << endl;
	} 	
	return 0;
}

4:mysort

描述

程序填空题,自己编写排序函数 mysort,使得其能够对任意类型的数组排序

#include <iostream>
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,
#include <iostream>
#include<algorithm>
using namespace std;
struct A {
	int nouse1;
	int nouse2;
	int n;
};
// 在此处补充你的代码
int mysort(void *a, int n, int w, int (*compare)(const void *e1, const void *e2))
{
	char * s = (char *)a;
	for(int i = n-1; i >= 1; --i)
	{
		for(int j = 0; j < i; ++j)
		{
			char * p1 = (char *) a + j * w;//a[j]
			char * p2 = (char *) a + (j + 1) * w;//a[j+1]
			if(compare(p1, p2) > 0)
			{
				for(int k = 0; k < w; ++k)//保证每一个字符都交换 
				{
					char tmp = p1[k];
					p1[k] = p2[k];
					p2[k] = tmp;
				}
			}
		}
	}
}
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;
}

从字符串中取数

描述

编写GetDoubleFromString函数,该函数可以不断从字符串中取出正浮点数或整数,无数可取,则返回值小于0

#include <iostream>
#include <iomanip>
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
#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)) {//cin.getline(line, sizeof(line))
		double n;
		n = GetDoubleFromString(line);
		while( n > 0) {
			cout << fixed << setprecision(6) << n << endl;
			n = GetDoubleFromString(NULL);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/yanyanwenmeng/article/details/82024970