此题贪心(绕)

· · 题解

题目描述

解题思路

所以最后结论就是小牌在前面,大牌中又按从大到小排。

注意事项

  1. 最后的大牌要单独排序。

  2. 记录的是至少,不是刚刚好。

  3. 方法有多种,输出一种就可以了,不用和样例一样。

奉上代码

#include <bits/stdc++.h>
using namespace std;
int A[500010],cw,n,k;//cw值的是错误个数
int cmp(int x,int y) { //从大到小排序 
    return x>y;
}
int main() {
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; i++)scanf("%d",&A[i]);
    sort(A+1,A+n+1);        //先正着牌  
    sort(A+n-k+1,A+n+1,cmp);//后k个要倒着牌  
    for(int i=n; i>=n-k+1; i--)
        if(cw<A[i]) cw++;
    if(cw!=k||A[n-k]>k) { //错误个数不是k个就无解  
        printf("-1");
        return 0;
    }
    for(int i=1; i<=n; i++) printf("%d ",A[i]);
    return 0;
}

此题有些绕,多读几遍题目。