洛谷 CF482A Diverse Permutation

CF482A

題目大意 :

構造一種n的序列,讓着n個數中間差值的絕對值有k種.

解題思路:

顯然我們有n個數最多可以組成n-1種不同的差值(感性的意會一下)

然後我們可以知道前k + 1個人可以組成k種不同的差值,然後我們可以第一個放上1

第二個,放上k + 1,第三個放到2,第四個放到k.....

然後我們我們就可以得到一個k,k-1,k-2...的差值,最後的時候放完了k個數之後.

我們就把沒放上的數從小到大依次放上,我們可以發現此時,剩下的數

組成的差值一定在上邊放上的出現過,而且剩下的那些依次放的時候

可以發現後邊的差值都是1.

code:

#include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

#define N 100010
#define M 1010

using namespace std;
int n, m, num[N], cnt;
map<int, bool> ma;

int read() {
	int s = 0, f = 0; char ch = getchar();
	while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
	while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
	return f ? -s : s;
}

int main() {
	n = read(), m = read();
	if (m == 1) {//特殊情況
		for (int i = 1; i <= n; i++) cout << i << " ";
		return 0;
	}
	cnt = 1, num[1] = 1;
	int j = ++m, i = 1; ma[1] = 1;
	while (cnt <= m) {
		if (ma[j - 1]) break;
		num[++cnt] = j--;
		ma[num[cnt]] = 1;
		if (ma[i + 1]) break;
		if (cnt < m) num[++cnt] = ++i, ma[i] = 1;
	}
	if (cnt >= n) 
		for (int i = 1; i <= n; i++) cout << num[i] << " ";
	else {
		int last = 2;
		for (int i = cnt + 1; i <= n; i++)
			for (int j = last; j <= n; j++)
				if(ma[j] == 0) {
					num[i] = j;
					last = j;
					ma[j] = 1;
					break;
				}
		for (int i = 1; i <= n; i++)
			cout << num[i] << " ";
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章