codeforces 549C Happy Line

傳送門

題意:

一行數字可以前後交換,交換後,之前在前面的數字+1,之前在後面的數字-1,問是否可以將這一行數字通過交換使得得到一行單調上升的數字

題解:

可以發現交換前後數字都只改變1

a_i,a_{i+1}\rightarrow a_{i+1}+1,a_i-1

不妨將數字的下標考慮進來,先不考慮\pm1,直接交換

a_i+i,a_{i+1}+i+1\rightarrow a_{i+1}+1+i,ai-1+i+1,可以發現我們交換後再減去下標就是上面的式子

所以原來的\pm1就可以等價爲直接交換

考慮到這樣一個事實我們先給a_i+i再排序後由於整體單增再減ii也是單增的,即可以貪心

代碼:

#include"iostream"
#include"algorithm"
#include"stdio.h"
using namespace std;
int a[200005];
int main()
{
//	freopen("text.in","r",stdin);
	int n;scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i]+=i;
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)a[i]-=i;
	for(int i=2;i<=n;i++)if(a[i]<a[i-1]){printf(":(");return 0;}
	for(int i=1;i<=n;i++)printf("%d ",a[i]);
	return 0;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章