排序的使用
分数线
某小学举办了一场校内的信息学竞赛选拔赛。
现在同学们的成绩都出来了,负责信息学竞赛的老师需要确定最终选拔赛的获奖名单。
为了鼓励大家,老师希望获奖人数不少于参赛总人数的一半。
因此,老师需要确定一个获奖分数线,所有得分在分数线及以上的同学可以获奖。
在满足上面条件的情况下,老师希望获奖分数线越高越好。
请同学们通过程序设计的方法来解决以上问题,确定获奖分数线和总获奖人数。
输入格式 第一行为一个整数 n 表示参赛总人数。
第二行为 n 个整数,分别表示 n(1≤n≤100000) 个参赛同学的分数,
所有分数都是在 0~100 之间的整数(含 0 和 100),每两个数之间用一个空格隔开。
输出格式 输出为一行,包括两个整数,分别表示分数线和获奖人数(中间用一个空格隔开)。
样例输入
7
76 71 42 4 27 27 20
样例输出
27 5
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int s[n];
int cnt = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &s[i]);
}
sort(s, s + n);
printf("%d ", s[n / 2]);
for (int i = 0; i < n; i++)
{
if (s[i] >= s[n / 2])
cnt++;
}
printf("%d", cnt);
return 0;
}
红绿蓝
蒜头君有一个罐子,里面装着红的、绿的、蓝的玻璃珠若干,分别用 R、G、B 表示。
蒜头君希望把它们排成一行,并且按照字典序排列(即 B -> G -> R 的顺序)。
然后以一红二绿三蓝为一组串成一串幸运珠,多余的放回罐子里,那么他能串成多少串幸运珠呢?
输入格式
输入为一行,是一个由若干个 R、G、B 乱序组成的字符串,长度小于 10000,每个字母至少出现一次。
输出格式
输出共 2 行; 第 1 行是排序完成后的字符串; 第 2 行是一个整数,为串成的幸运珠的数目。
样例输入
RGGBBB
样例输出
BBBGGR
1
/*
1.排序
2.可以串成幸运珠的数目,取决于r,g/2,b/3中的最小者
*/
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
char str[10005];
int main()
{
scanf("%s", str);
int len = strlen(str);
int cnt[3] = {0};
for (int i = 0; i < len; i++)
{
if (str[i] == \'R\')
{
cnt[0]++;
}
if (str[i] == \'G\')
{
cnt[1]++;
}
if (str[i] == \'B\')
{
cnt[2]++;
}
}
sort(str, str + len);
printf("%s\n", str);
if (cnt[1] / 2 < cnt[0])
{
cnt[0] = cnt[1] / 2;
}
if (cnt[2] / 3 < cnt[0])
{
cnt[0] = cnt[2] / 3;
}
printf("%d",cnt[0]);
return 0;
}
交叉排序
蒜头君很无聊,他想对数组中的某些元素进行排序。
现在我们有 N 个数,他想先将数组中第 l1 到第 r1 的数字按从小到大的顺序排序。
再将数组中第 l2 到第 r2 的数字按从大到小的顺序排序。
我们帮他算一算数组排序后的结果吧~
输入格式 第一行五个整数 N, l1, r1, l2, r2
其中 0 < l1 < r1 < N, 0 < l2 < r2 < N
这五个数不超过 10000; 第二行为 N 个整数。
输出样例 一行 N 个整数,表示数组排序以后的结果,数字之间用空格隔开,末尾换行。
样例输入
6 1 3 2 4
8 3 1 6 9 2
样例输出
1 8 6 3 9 2
//这个破题一直说我格式错误
//我觉得判题判的有问题
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n, l1, r1, l2, r2;
cin >> n >> l1 >> r1 >> l2 >> r2;
int a[10000];
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a + l1 - 1, a + r1);
sort(a + l2 - 1, a + r2, greater<int>());
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
前K名的平均数
小蒜的老师希望知道班上的信息学尖子生的水平如何。
老师请小蒜同学帮忙算出班上信息学成绩前 K 名的平均成绩。
输入格式 输入共有三行:
第一行:为小蒜所在班级的人数 N(其中 1≤N≤30);
第二行:为 N 个用 1 个空格隔开的信息学分数(其中分数为 700 及以内正整数);
第三行:老师想计算平均数的尖子生人数 K。
输出格式 输出一行共一个实数,为信息学分数前 K 名同学的分数平均数。四舍五入保留两位小数。
样例输入
10
93 85 77 68 59 100 43 94 75 82
4
样例输出
93.00
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
int a[30];
int k;
int sum=0;
scanf("%d",&n);
for (int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&k);
sort(a,a+n,greater<int>());
for (int i = 0; i < k; i++)
{
sum+=a[i];
}
printf("%.2f\n",sum*1.0/k);
return 0;
}