第十周练习 柔光的暖阳◎ 2022-05-15 04:50 158阅读 0赞 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; }
相关 第十六周. 16周 问题 A: yangftc的时间安排 问题 B: 自守数 问题 C: 相聚HNUCM校园食堂 问题 D: 0-1背包问题(回溯法) 绝地灬酷狼/ 2022年10月08日 02:30/ 0 赞/ 175 阅读
相关 第十周 扩展 实验目的:做窗口 实验内容:做窗口 // 以下是我编制的程序 // rootDlg.cpp : implementation file 电玩女神/ 2022年06月16日 13:12/ 0 赞/ 37 阅读
相关 第八九周练习 1:指针练习:输出Hello 描述 下面程序片段的输出结果是 Hello ,请填空 include <iostream> using namespac 野性酷女/ 2022年05月19日 10:58/ 0 赞/ 195 阅读
相关 第十周练习 7615 成绩排序 http://noi.openjudge.cn/ch0110/03/ 7914 分数线划定 http://noi.openjudge.cn/ch0110 柔光的暖阳◎/ 2022年05月15日 04:50/ 0 赞/ 159 阅读
相关 第十周作业 > 1、 简述DNS服务,并搭建DNS服务器,实现主从,子域授权 答:在slave服务器上 vim /etc/named.rfc1912 zone “kil 矫情吗;*/ 2022年01月12日 20:43/ 0 赞/ 232 阅读
相关 第十周作业 第十周作业 <table> <thead> <tr> <th>这个作业属于那个课程</th> <th>C语言程序设计II</th> </t 灰太狼/ 2022年01月09日 06:43/ 0 赞/ 262 阅读
相关 第十周阅读 <table> <thead> <tr> <th style="text-align:right;">这个作业属于哪个课程</th> <th styl 素颜马尾好姑娘i/ 2022年01月06日 03:41/ 0 赞/ 234 阅读
相关 第十七周 一.学习 1.这一周基本上进入复习周了,大家都在备考当中,而我感觉这一周的效率不是很高,没有复习到多少东西,进度和16周的没有什么区别,所以自己内心还是有点小慌张 清疚/ 2021年11月10日 23:58/ 0 赞/ 312 阅读
相关 第十周总结 本周51放假。所以就玩了好几天,放松一下准备团队冲刺。 这一周在代码上花费的时间加起来差不多8个小时。 共写了500行代码。 发表博客2篇 转载于:https://ww 柔情只为你懂/ 2021年10月01日 02:50/ 0 赞/ 327 阅读
还没有评论,来说两句吧...