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] << " ";
}
}