1.简单应用排序问题
bool cmp(int x, int y){
return x > y;
}
int main(){
int arr[10];
for(int i = 0; i < 10; i ++){
cin >> arr[i];
}
//默认排序方式是从小到大
sort(arr, arr + 10);
for(int i = 0; i < 10; i ++){
cout << arr[i] << " ";
}
cout << endl;
//cmp可以让他用你想让的方式排序,如从大到小
sort(arr, arr + 10, cmp);
for(int i = 0; i < 10; i ++){
cout << arr[i] << " ";
}
return 0;
}
const int M = 1e3;
int N, K, sum, score[M];
int main(){
scanf("%d", &N);
for(int i = 0; i < N; i ++){
scanf("%d", &score[i]);
}
scanf("%d", &K);
sort(score, score + N, greater<int>());
for(int i = 0; i < K; i ++){
sum += score[i];
}
printf("%.2f\n", 1.0 * sum / K);
return 0;
}
2.按照除以三余数从小到大排序,若相等,按照数字从小到大排序
int num[105];
bool cmp(int x, int y){
if(x % 3 != y % 3){
return x % 3 < y % 3;
}
else{
return x < y;
}
}
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i ++){
scanf("%d", &num[i]);
}
sort(num, num + n, cmp);
for(int i = 0; i < n; i ++){
if(i != n - 1)
printf("%d", num[i]);
else printf("%d\n", num[i]);
}
return 0;
}
3.一组小数,按照他和距离他最近的整数的差从小到大排序,若差等,则从小到大排序
const double EPSILON = 1e-6; // 常量,10的-6次方
double num[105];
bool cmp(double a, double b){
double da = fabs(a - round(a));// abs是int的绝对值,fabs是double的绝对值
double db = fabs(b - round(b));// round是四舍五入,正负数整数浮点数都可以
if(fabs(da - db) < EPSILON){
return a < b;
}
else return da < db;
}
int main(){
int N;
scanf("%d", &N);
for(int i = 0; i < N; i ++){
scanf("%lf", &num[i]);
}
sort(num, num + N, cmp);
for(int i = 0; i < N; i ++){
if(i != N - 1){
printf("%lf ", num[i]); // "%d "为后面加空格, " %d"为前面加空格
}
else{
printf("%lf\n", num[i]);
}
}
return 0;
}
4.幸运珠
#include<bits/stdc++.h>
using namespace std;
//幸运珠是1R2G3B在一起
const int maxx = 1e3;
char s[maxx];
int main(){
int len, r, g, b;
scanf("%s", s);
len = strlen(s);
sort(s, s + len);
printf("%s\n", s);
r = 0;
g = 0;
b = 0;
for(int i = 0; i < len; i ++){
if(s[i] == 'R') r ++;
else if(s[i] == 'G') g ++;
else b ++;
}
printf("%d\n", min(r,min(g / 2, b / 3)));
return 0;
}
5.多位数每位数相加的和从小到大,否则从小到大排列
#include<bits/stdc++.h>
using namespace std;
const int maxx = 1e3 + 7;
int n, suma, sumb, s[maxx];
bool cmp(int a, int b){
int aa = a, bb = b;
if(a){
suma += a % 10;
a /= 10;
}
if(b){
sumb += b % 10;
b /= 10;
}
if(suma == sumb){
return aa < bb;
}
return suma < sumb;
}
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i ++){
scanf("%d", &s[i]);
}
sort(s, s + n, cmp);
for(int i = 0; i < n; i ++){
if(i != n - 1) printf("%d ", s[i]);
else printf("%d\n", s[i]);
}
return 0;
}
6.班里n个人,成绩按照从大到小排序,输出排序后同学的编号
#include<bits/stdc++.h>
using namespace std;
struct Student{
int score;
int id;
};
bool cmp(Student a, Student b){
return a.score > b.score;
}
int main(){
int n;
Student stu[105];
scanf("%d", &n);
for(int i = 0; i < n; i ++){
scanf("%d", &stu[i].score);
stu[i].id = i + 1;
}
sort(stu, stu + n, cmp);
for(int i= 0; i < n; i ++){
if(i != n - 1) printf("%d ", stu[i].id);
else printf("%d\n", stu[i].id);
}
return 0;
}