在上文中我们进行了排序算法的判断题、选择题的专项练习,在这一篇中我们将进行排序算法中编程题的练习。
编程题
R7-1 字符串的冒泡排序
我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。
输出格式:
输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。
输入样例:
6 2
best
cat
east
a
free
day
输出样例:
best
a
cat
day
east
free
这里要知道一个知识点:先比较两个字符串的第一个字符的ASCII码值),如果第一个字符串的第一个字符大于第二个字符串的第一个字符,则返回1;反之,则返回-1;若两个字符相等,则进行下一对字符的比较,(下面的比较均是ASCII码值的比较)直到出现有一对字符不同则返回相应的值(1或-1)。若两个字符串所有的字符都相同,则返回数字0。
#include <stdio.h>
#include <string.h>
int main()
{
int n,k;scanf("%d%d",&n,&k);char a[100][11]={
0},x[11];
for(int i=0;i<n;i++)//用二维数组存储
{
scanf("%s",&a[i]);
}
for(int i=0;i<k;i++)//对于每个元素而言
{
for(int j=0;j<n-i-1;j++)//每个元素都比较n-i-1次
{
if(strcmp(a[j],a[j+1])>0)//交换
{
strcpy(x,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],x);
}
}
}
for(int i=0;i<n;i++)
printf("%s\n",a[i]);
}
R7-1 抢红包
没有人没抢过红包吧…… 这里给出N个人之间互相发红包、抢红包的记录,请你统计一下他们抢红包的收获。
输入格式:
输入第一行给出一个正整数N(≤104),即参与发红包和抢红包的总人数,则这些人从1到N编号。随后N行,第i行给出编号为i的人发红包的记录,格式如下:
K N1 P1 ⋯ NK PK
其中K(0≤K≤20)是发出去的红包个数,Ni是抢到红包的人的编号,Pi(>0)是其抢到的红包金额(以分为单位)。注意:对于同一个人发出的红包,每人最多只能抢1次,不能重复抢。
输出格式:
按照收入金额从高到低的递减顺序输出每个人的编号和收入金额(以元为单位,输出小数点后2位)。每个人的信息占一行,两数字间有1个空格。如果收入金额有并列,则按抢到红包的个数递减输出;如果还有并列,则按个人编号递增输出。
输入样例:
10
3 2 22 10 58 8 125
5 1 345 3 211 5 233 7 13 8 101
1 7 8800
2 1 1000 2 1000
2 4 250 10 320
6 5 11 9 22 8 33 7 44 10 55 4 2
1 3 8800
2 1 23 2 123
1 8 250
4 2 121 4 516 7 112 9 10
输出样例:
1 11.63
2 3.63
8 3.63
3 2.11
7 1.69
6 -1.67
9 -2.18
10 -3.26
5 -3.26
4 -12.32
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
// 定义结构体redbag,用于存储每个人的红包信息
struct redbag{
int id; // 编号
int count = 0; // 收到红包的个数
int money = 0; // 最终收到的金额
};
// 自定义比较函数cmp,用于sort排序时指定排序规则
bool cmp(redbag &r1, redbag &r2){
if(r1.money != r2.money){
// 按照最终收到的金额从大到小排序
return r1.money > r2.money;
}else if(r1.count != r2.count){
// 如果最终收到金额相等,则按照收到红包的个数从大到小排序
return r1.count > r2.count;
}else{
// 如果最终收到金额和收到红包的个数都相等,则按照编号从小到大排序
return r1.id < r2.id;
}
}
int main(){
int n; // 总人数
cin >> n;
redbag red[n+1]; // 定义数组red,用于存储每个人的信息
int k, card, mon; // k表示某个人发出的红包数,card表示发红包的人的编号,mon表示红包金额
for(int i = 1; i <= n; i++){
cin >> k;
red[i].id = i;
for(int j = 1; j <= k; j++){
cin >> card >> mon;
red[i].money -= mon; // 发出红包的人需要减掉红包金额
red[card].money += mon; // 收到红包的人需要加上红包金额
red[card].count++; // 收到红包的人收到红包数加1
}
}
sort(red+1, red+n+1, cmp); // 使用sort排序,按照指定的cmp规则排序
for(int i = 1<