1:成绩排序
-
总时间限制:
- 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
结构体二级排序:
#include "iostream"
#include "algorithm"
#include "cstring"
using namespace std;
struct Student {
int score;
char name[21];
}stu[21];
int cmp(Student s1,Student s2) {
bool flag = 0;
if (s1.score > s2.score)
flag = 1;
else if (s1.score < s2.score)
flag = 0;
else if (s1.score == s2.score) {
if (strcmp(s1.name, s2.name) < 0 )
flag = 1;
else
flag = 0;
}
return flag;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> stu[i].name >> stu[i].score;
}
sort(stu, stu + n, cmp);
for (int i = 0; i < n; i++) {
cout << stu[i].name << " " << stu[i].score <<endl;
}
return 0;
}
2:分数线划定
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
世博会志愿者的选拔工作正在 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"
#include "cstring"
using namespace std;
struct Student {
int k;
int score;
}stu[5001];
int cmp(Student s1,Student s2) {
bool flag = 0;
if (s1.score > s2.score)
flag = 1;
else if (s1.score < s2.score)
flag = 0;
else if (s1.score == s2.score) {
if (s1.k < s2.k)
flag = 1;
else
flag = 0;
}
return flag;
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> stu[i].k >> stu[i].score;
}
sort(stu, stu + n, cmp);
int o = (int)(1.5*m);
for (int i = o; i < n; i++) {
if (stu[o - 1].score == stu[i].score) {
o++;
}
}
cout << stu[o-1].score << " " << o << endl;
for (int i = 0; i <o; i++) {
cout << stu[i].k << " " << stu[i].score <<endl;
}
return 0;
}
3:病人排队
-
总时间限制:
- 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
此题要用稳定的排序 不能用sort
#include "iostream"
#include "vector"
#include "algorithm"
#include "cstring"
using namespace std;
struct Patient {
char id[11];
int age;
};
bool cmpOld(Patient p1, Patient p2) {
return p1.age > p2.age;
}
int main() {
int n;
vector<Patient>old, young;
cin >> n;
for (int i = 0; i < n; i++) {
Patient p;
cin >> p.id >> p.age;
if (p.age >= 60)
old.push_back(p);
else
young.push_back(p);
}
stable_sort(old.begin(), old.end(), cmpOld);
for (int i = 0; i < old.size(); i++) {
cout << old[i].id << endl;
}
for (int i = 0; i < young.size(); i++) {
cout << young[i].id << endl;
}
return 0;
}
4:mysort
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
程序填空题,自己编写排序函数 mysort,使得其能够对任意类型的数组排序
#include <iostream>
using namespace std;
struct A {
int nouse1;
int nouse2;
int n;
};
#include "cstring"
// 在此处补充你的代码
void mysort(const void* a,int n,int size,int p(const void*,const void*)) {
char* b = (char*)a;
for(int i=n-1; i>=1 ;i--)
for (int j = 0; j < i; j++) {
if (p(b + j*size, b + (j + 1)*size) > 0 ) {
char* s = new char[size];
memcpy(s,b+j*size,size);
memcpy(b+j*size,b+(j+1)*size,size);
memcpy(b+(j+1)*size,s,size);
}
}
}
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;
}
5:从字符串中取数
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
编写GetDoubleFromString函数,该函数可以不断从字符串中取出正浮点数或整数,无数可取,则返回值小于0
#include <iostream> #include <iomanip> using namespace std; double GetDoubleFromString(char * str) { // 在此处补充你的代码 static char* p = NULL; char s1[301]; int k =0; if (str) { p = str; while ((!isdigit(*p)) && (*p!='.') && *p!='\0') { p++; } for (; (isdigit(*p) || (*p == '.') && *p!='\0'); p++) { s1[k++] = *p; } s1[k] = '\0'; } else if ((!str) && (*p!='\0')) { while (!isdigit(*p) && (*p != '.')) { p++; } for (; isdigit(*p) || (*p == '.'); p++) { s1[k++] = *p; } s1[k] = '\0'; } if (k == 0) return -1; else return atof(s1); } 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; }