HDU 5916

来源:互联网 发布:淘宝商城怎么开店 编辑:程序博客网 时间:2024/06/07 02:19

题目大意:有t个样例,每个样例,输入n和k,其中n代表一段序列为1,2,3...n的标准序列,k代表第k小的序列。输出这个序列,序列的值根据公式计算,公式的意思为每相邻两个数的最大公约数的累积和。

解题思路:标准序列必然为最小序列且值为n-1(同值序列不唯一),易发现相邻的奇数最小公约数也为1,而相邻的偶数最小公约为为2,根据题目又发现2k≤n,也就是所可能求最大的序列的值为n+2k-2,而每次将相邻的两个偶数放在前面就会使得值增加一,排名就会靠近一位。最多将所有偶数放前面就能达到极限。

ac代码:

#include <iostream>#include <cstring>using namespace std;int main(){int t, n, k, cnt = 1, vis[10005];cin >> t;while (t--){scanf("%d%d", &n, &k);memset(vis, 0, sizeof(vis));printf("Case #%d:", cnt++);for (int i=1; i<=k; i++){printf(" %d", 2*i);vis[2*i] = 1; }for (int i=1; i<=n; i++)if (!vis[i])printf(" %d", i);printf("\n");}return 0;}


进一位的12

原创粉丝点击