The Phone Number |
---|
题意: 给定1~n的n个数,构造出一个最长上升子序列长度与最长下降子序列长度和最小的序列。
题解:
- 例如
1、2、3、4、5
,很容易可以想到的就是折半成4、5、1、2、3
,如此和值为3 + 2 = 5。 - 但如果换成是
1、2、3、4、5、6、7、8、9
,还是像这样折半的话5、6、7、8、9、1、2、3、4
,和值为5 + 2 = 7。
再想,想,似乎可以更小。7、8、9、4、5、6、1、2、3
,和值为3 + 3 = 6。
尝试总结:想办法把整个序列分成K段,每段拥有L个元素。段中元素严格递增,则最长上升子序列长度为L。不同段的元素严格递减,则最长下降子序列的长度为K。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
scanf("%d", &n);
int x = (n + 1) / 2, y = (n > 1) ? 2 : 1;
for(int i = 1; i <= sqrt(n); i++) {
int z = n / i;
(n % i == 0) ? z : z++;
if(i + z < x + y) x = i, y = z;
}
for(int i = x - 1; i >= 0; i--)
for(int j = i * y + 1; j <= min((i + 1) * y, n); j++)
printf("%d ", j);
return 0;
}