[第三場(2)]Karte

題目描述
你有一副共有N張牌的牌,在第i張牌上會有一個數字ai表示在這張牌下面至少一共有ai張牌上的信息是假的。接下來你需要對這副牌進行洗牌,使得這副牌當中,恰好有K張牌的信息是錯誤的。
輸入格式
第一行輸入兩個數字N、K(1≤N≤5*105,0≤K≤N)。

接下來N行,每行輸入一個數字,表示第i張牌上的數字ai(0≤ai≤5*105)
輸出格式
如果不存在恰好K張牌上的信息是錯誤的情況,則輸出-1,否則,將這副牌從上往下輸出這N張牌上的所對應的ai。如果有多種答案,輸出任意一種。
樣例
樣例輸入1

4 2
1
2
2
3
樣例輸出1

2 3 1 2
樣例輸入2

5 3
2
1
3
0
3
樣例輸出2

3 3 0 1 2
樣例輸入3

6 4
0
2
5
2
0
1
樣例輸出3

-1
數據範圍與提示
對於樣例2:第5張牌後沒有牌,所以他後面是錯誤的牌的數量應該是0,但他是2,所以這張牌是錯誤的。第4牌後面有1張牌是錯誤的(第5張),它上面寫的是1,所以是正確的。第3張牌上寫的是0,它後面有1張牌是錯誤的(第5張),所以它是正確的(題目說的是至少有,不是確定有)。第2張牌上面寫的是3,但它後面只有一張是錯誤的(第5張)所以是錯誤的。第1張牌上寫的是3,但它後面只有2張是錯誤的(第2張和第5張),所以是錯誤的。即一共有3張是錯誤的。

解題思路

首先我們確定一點,牌的值越小,錯誤率越低。
我們進行排序,我們把值比較大的放在後面,放k個。
但要保證這一堆全錯,我們就將這一堆進行反轉,因爲越往後,牌是越少的,我們將小的放在後面,錯誤率會高。
然後在判斷一下是否符合條件。如果倒數k + 1的值都大於k,那肯定不合格。
然後判斷那一堆裏面是否符合。很簡單。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int n,k,a[1000005];
int main(){
	scanf ("%d%d",&n,&k);
	for (int i = 1;i <= n;i ++)
		scanf ("%d",&a[i]);
	sort(a + 1,a + 1 + n);
	int l = n - k + 1,r = n;
	while (l < r){
		swap(a[l],a[r]);
		l ++;
		r --;
	}
	if (a[n - k] > k){
		printf("-1");
		return 0;
	}
	for (int i = n - k + 1;i <= n;i ++)
		if (a[i] < n - i - 1){
			printf("-1\n");
			return 0;
		}
	for (int i = 1;i < n;i ++)
		printf("%d ",a[i]);
	printf("%d\n",a[n]);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章