问题 A: 排序
时间限制: 1 Sec 内存限制: 32 MB
题目描述
对输入的n个数进行排序并输出。
输入
输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
输出
可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。
每组测试数据的结果占一行。
样例输入
5
5 4 3 1 2
样例输出
1 2 3 4 5
解题思路
本题采用冒泡排序来解决,虽然速度很慢,此处主要是用于记录该方法。冒泡排序的本质在于交换,即每次通过交换的方式把当前剩余元素的最大值移动到一端,当剩余元素减少为0时,排序结束。
Submission
#include <stdio.h>
#include <string.h>
int main() {
int a[101];
int i,j,n;
int temp;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(j=1;j<=n-1;j++){
for(i=0;i<n-j;i++){
if(a[i]>a[i+1]){
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}
问题 B: 特殊排序
时间限制: 1 Sec 内存限制: 32 MB
题目描述
输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序。
输入
输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。
接下来的一行有N个整数。
输出
可能有多组测试数据,对于每组数据,
第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。
第二行将排序的结果输出。
样例输入
5
5 3 2 4 1
样例输出
5
1 2 3 4
提示
如果数组中只有一个数,当第一行将其输出后,第二行请输出”-1”。
解题思路
此题采用选择排序进行排序,先排序,后去除掉最大值。本题比较容易卡壳的地方是读错题目,我一直以为要去掉所有重复的最大值,最后发现只要去掉最后一个最大值,忧伤.jpg。
Submission
#include <stdio.h>
#include <string.h>
int main() {
int i,j,n;
int temp=0;
while(scanf("%d",&n)!=EOF){
int a[2000]={0};
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
int k=i;
for(j=i;j<n;j++){
if(a[j]<a[k])
k=j;
}
if(k!=i){
temp=a[k];//交换a[k]与a[i]
a[k]=a[i];
a[i]=temp;
}
}
if(n!=1){
printf("%d \n",a[n-1]);
for(i=0;i<n;i++)
{
if(i!=n-2){
printf("%d ",a[i]);
}
else if(i==n-2){
printf("%d\n",a[i]);
break;
}
}
}
else{
printf("%d \n",a[0]);
printf("-1\n");
}
}
return 0;
}
由于考试中的排序题大部分都只需要得到排序的最终结果,而不需要去写排序的完整过程,因此可以直接使用C语言中的库函数qsort或是C++中的sort函数进行排序,此题直接用sort函数的解法如下:
Submission
#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
int n;
int buf[1000];
while (scanf("%d", &n) != EOF) {
for (int i=0; i<n; i++) {
scanf("%d", &buf[i]);
}
sort(buf, buf+n);
printf("%d\n", buf[n-1]);
if (n == 1) {
printf("-1\n");
} else {
for (int i=0; i<n-1; i++) {
if (i==n-2) {
printf("%d\n", buf[i]);
} else {
printf("%d ", buf[i]);
}
}
}
}
return 0;
}
问题 C: EXCEL排序
时间限制: 1 Sec 内存限制: 32 MB
题目描述
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
解题思路
这道题很常规,问题类型属于结构体的比较。主要解决两个问题,一是交换排序的排序准则,二是将两个结构体的位置进行交换。
Submission
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct student{
char id[10];
char name[10];
int score;
}stu[100010];
bool cmp_score(student a, student b){
if(a.score != b.score) return a.score < b.score;
else return strcmp(a.id, b.id) < 0;
}
bool cmp_id(student a, student b){
return strcmp(a.id, b.id) < 0;
}
bool cmp_name(student a, student b){
if(strcmp(a.name, b.name)) return strcmp(a.name, b.name) < 0; //之前把判断条件写成了(a.name != b.name),在C++中可以用string直接进行比较,但是char数组之间的比较必须使用strcmp函数。
else return strcmp(a.id, b.id) < 0;
}
int main(){
int i,n,c,num;
num=0;
while(scanf("%d %d",&n,&c)&&n!=0){
num++;
for(i=0; i<n; i++){
scanf("%s %s %d", &stu[i].id, &stu[i].name, &stu[i].score);
}
if(c==1){
sort(stu, stu+n, cmp_id);
}
else if(c==2){
sort(stu, stu+n, cmp_name);
}
else if(c==3){
sort(stu, stu+n, cmp_score);
}
printf("Case %d:\n", num);
for(i=0; i<n; i++){
printf("%s %s %d \n" ,stu[i].id, stu[i].name, stu[i].score);
}
}
return 0;
}
问题 D: 字符串内排序
时间限制: 1 Sec 内存限制: 32 MB
题目描述
输入一个字符串,长度小于等于200,然后将输出按字符顺序升序排序后的字符串。
输入
测试数据有多组,输入字符串。
输出
对于每组输入,输出处理后的结果。
样例输入
tianqin
样例输出
aiinnqt
提示
注意输入的字符串中可能有空格。
解题思路
运用插入排序进行排序,只是变换一下数据类型。
Submission
#include<stdio.h>
#include<string.h>
int main(){
char str[201];
int i, j, k;
while(gets(str)){
j = 0;
for( i = 1 ; i < strlen (str) ; i++){
char temp = str[i];
int j = i;
while(j > 0 && temp < str[j-1]){
str[j] = str[j-1];
j--;
}
str[j] = temp;
}
printf("%s\n",str);
}
return 0;
}
这些题目都很简单啊,先巩固一遍基础再刷复杂的逻辑题比较好~