Description
2022年6月17日下午,ywh 结束了他的电路考试,他觉得自己发挥得非常好,所以他的长辈 x-x 决定和他一起玩个小游戏,如果他能成功通关,那么 x-x 会奖励 ywh 最喜欢吸的速溶柠檬粉。小游戏规则如下: 给 ywh n 个互不相同的数字,经过随意排列后(每个数字都需要参与排列),他需要快速地回答第 k 大的数,可是 ywh 在经过高数和电路考试后彻底失智,所以他求助了他的好朋友,也就是屏幕前的你,请你帮助他赢得他最爱的奖励!
(回答成功便有机会和 ywh 一起吸他最爱的速溶柠檬粉!)(是真的!)
注:第 k 大指的是从大到小排第 k
Input
第一行给出 n、k 。(1≤n≤9, 1≤k≤n!)
第二行给出一长度为 n 的数组 a , (1≤ai≤9) 且各不相同。
Output
将 a 数组中的数任意组合,求其中第 k 大的数。(题目保证能找到第 k 大的数)
Samples
input
5 1
1 2 3 4 5
output
54321
AC代码
全排列算法真不太会,从B站上浅学了一下
#include <stdio.h>
#include <stdlib.h>
int count = 0;
void swap(int a[], int left, int right) {
//按大小进行排序
int temp = a[right];
for (int i = right; i > left; i--) {
a[i] = a[i - 1];
}
a[left] = temp;
}
void swapback(int a[], int left, int right) {
int temp = a[left];
for (int i = left; i < right; i++) {
a[i] = a[i + 1];
}
a[right] = temp;
}
void perm(int a[], int left, int right, int k) {
if (left == right) {
count++;
if (count == k) {
for (int i = 0; i <= right; i++) {
printf("%d", a[i]);
}
return 0;
}
}
else {
for (int i = left; i <= right; i++) {
swap(a, left, i);
perm(a, left + 1, right,k);
swapback(a, left, i);
}
}
}
int compare(const void* a, const void* b) {
return (*(int*)b) - (*(int*)a);
}
int main() {
int n, k;
scanf("%d %d", &n, &k);
int* a = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
qsort(a, n, sizeof(int), compare);
perm(a, 0, n - 1, k);
free(a);
return 0;
}