4.1小节——算法初步->排序
A题 排序
题目描述
对输入的n个数进行排序并输出。
输入
输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
输出
可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。
每组测试数据的结果占一行。
样例输入
5
5 4 3 1 2
样例输出
1 2 3 4 5
代码
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> A;
int main()
{
int n=0,temp;
while(scanf("%d",&n)!=EOF)
{
for (int i=0;i<n;i++)
{
scanf("%d",&temp);
A.push_back(temp);
}
sort(A.begin(),A.end());
for (int i=0;i<n;i++)
{
printf("%d",A[i]);
if (i!=n-1)
printf(" ");
else
printf("\n");
}
A.clear();
}
return 0;
}
Tips
vector存储+sort排序
B题 特殊排序
题目描述
输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序。
输入
输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。
接下来的一行有N个整数。
输出
可能有多组测试数据,对于每组数据,
第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。
第二行将排序的结果输出。
样例输入
5
5 3 2 4 1
样例输出
5
1 2 3 4
代码
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> A;
int main()
{
int n,i,temp;
while(scanf("%d",&n)!=EOF)
{
for (i=0;i<n;i++)
{
scanf("%d",&temp);
A.push_back(temp);
}
if (n==1)
{
printf("%d\n-1\n",temp);A.clear();continue;
}
else
{
sort(A.begin(),A.end());
printf("%d\n",A[A.size()-1]);
for (i=0;i<n-1;i++)
{
printf("%d",A[i]);
if (i!=n-2)
printf(" ");
else
printf("\n");
}
A.clear();
}
}
return 0;
}
Tips
千万不要忘了clear()
C题 EXCEL排序
题目描述
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 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
样例输入
4 1
000001 Zhao 75
000004 Qian 88
000003 Li 64
000002 Sun 90
4 2
000005 Zhao 95
000011 Zhao 75
000007 Qian 68
000006 Sun 85
4 3
000002 Qian 88
000015 Li 95
000012 Zhao 70
000009 Sun 95
0 3
样例输出
Case 1:
000001 Zhao 75
000002 Sun 90
000003 Li 64
000004 Qian 88
Case 2:
000007 Qian 68
000006 Sun 85
000005 Zhao 95
000011 Zhao 75
Case 3:
000012 Zhao 70
000002 Qian 88
000009 Sun 95
000015 Li 95
代码
#include <stdio.h>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int flag=0;
struct stu
{
int num;
char name[9];
int grade;
};
bool cmp(stu x,stu y)
{
if (flag==1)
return (x.num<y.num);
else if(flag==2)
{
if (strcmp(x.name,y.name)!=0)
return (strcmp(x.name,y.name)<0);
else
return (x.num<y.num);
}
else
{
if (x.grade!=y.grade)
return (x.grade<y.grade);
else
return (x.num<y.num);
}
}
vector<stu> A;
int main()
{
int n,i,count=0;
stu temp;
while(scanf("%d %d",&n,&flag)!=EOF)
{
if (n==0)
break;
printf("Case %d:\n",count+1);
for (i=0;i<n;i++)
{
scanf("%d %s %d",&temp.num,&temp.name,&temp.grade);
A.push_back(temp);
}
sort(A.begin(),A.end(),cmp);
for (i=0;i<n;i++)
{
printf("%06d %s %d\n",A[i].num,&A[i].name,A[i].grade);
}
count++;
A.clear();
}
return 0;
}
Tips
按照不同标准结构体排序
D题 字符串内排序
题目描述
输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串。
输入
测试数据有多组,输入字符串。
输出
对于每组输入,输出处理后的结果。
样例输入
tianqin
样例输出
aiinnqt
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char A[201];
int main()
{
int n,i;
memset(A,'\0',sizeof(A));
while(scanf("%[^\n]",&A)!=EOF)
{
n=strlen(A);
sort(A,A+n);
printf("%s\n",A);
getchar();
}
return 0;
}
Tips
sort函数的使用,其中别忘了设置n=strlen(A)