- 排序课后练习---共3题 题目描述:
-
输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序。
- 输入:
-
输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。接下来的一行有N个整数。
- 输出:
-
可能有多组测试数据,对于每组数据,第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。第二行将排序的结果输出。
- 样例输入:
-
4 1 3 4 2
- 样例输出:
-
4 1 2 3
- 提示:
-
如果数组中只有一个数,当第一行将其输出后,第二行请输出"-1"。
#include <stdio.h>
#include <algorithm>
using namespace std;
int arr[1000];
int main()
{
int num;
while(scanf("%d",&num)!=EOF){
for(int i = 0;i < num;i++){
scanf("%d",&arr[i]);
}
sort(arr,arr+num);//从小到大排序
printf("%d\n",arr[num-1]);//输出最大的数
if((num-1)!=0){
//将剩余的数按照从小到的的顺序输出
for(int i = 0;i < num-1;i++){
printf("%d",arr[i]);
if(i != num -2){ //注意输出格式,在输出每行的最后一个数字时,不必再输出空格,直接输出换行
printf(" ");
}
}
printf("\n");
}else{
printf("-1\n");
}
}
return 0;
}
- 题目描述:
-
Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3
时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
- 输入:
-
测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (N<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。
- 输出:
-
对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3
时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
- 样例输入:
-
3 1 000007 James 85 000010 Amy 90 000001 Zoe 60 4 2 000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 98 4 3 000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 90 0 0
- 样例输出:
-
Case 1: 000001 Zoe 60 000007 James 85 000010 Amy 90 Case 2: 000010 Amy 90 000002 James 98 000007 James 85 000001 Zoe 60 Case 3: 000001 Zoe 60 000007 James 85 000002 James 90 000010 Amy 90
要注意两个问题:
1)排序函数写成三个不同的方法,根据i的不同调用不同的方法-----最开始自己是把<进行了重载,在重载函数中根据不同的i执行相应的分支---这种思路很不好,而且提交后会报莫名的错误---囧--要吸取教训
2)注意细节---在读题时,一定要注意输入输出的格式---在本题中Case j(这里的j值得是第几组输出,而不是排序时依据的i)
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct Student
{
int no;
char name[9];
int score;
}stu[100000];
bool cmp1(Student x,Student y){
return x.no < y.no;
}
bool cmp2(Student x,Student y){
if(strcmp(x.name,y.name)!=0){
return strcmp(x.name,y.name) < 0;
}else{
return x.no < y.no;
}
}
bool cmp3(Student x,Student y){
if(x.score != y.score){
return x.score<y.score;
}else{
return x.no<y.no;
}
}
int main()
{
int i;
int num;
int count = 1;
scanf("%d%d",&num,&i);
while(num != 0 && i !=0){
for(int j =0;j < num;j++){
scanf("%d%s%d",&stu[j].no,stu[j].name,&stu[j].score);
}
switch(i){
case 1:sort(stu,stu+num,cmp1);break;
case 2:sort(stu,stu+num,cmp2);break;
case 3:sort(stu,stu+num,cmp3);break;
}
printf("Case %d:\n",count); //case后跟的应该是用例的序号而不应该是排序方式
for(int j = 0;j<num;j++){
printf("%06d %s %d\n",stu[j].no,stu[j].name,stu[j].score);
}
scanf("%d%d",&num,&i);
count++;
}
return 0;
}
- 题目描述:
-
输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串。
- 输入:
-
测试数据有多组,输入字符串。
- 输出:
-
对于每组输入,输出处理后的结果。
- 样例输入:
-
bacd
- 样例输出:
-
abcd
迄今为止做的最顺利的题了----原谅我C忘得差不多了--但我会努力滴
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
bool cmp(char x,char y)
{
return x<y;
}
int main()
{
char str[201];
while(scanf("%s",str)!=EOF){
sort(str,str+strlen(str),cmp);
printf("%s\n",str);
}
return 0;
}