#include<bits/stdc++.h> usingnamespace std; #define ll long long #define debug(x) cout<<#x<<":\t"<<x<<endl; constint N = 2e6 + 10; constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 1e9 + 7; int n; int a[N], b[N]; intmain(){ scanf("%d", &n); for (int i = 1; i <= n; i++)scanf("%d", &a[i]); sort(a + 1, a + n + 1); int p = 1, q = n / 2 + 1; for (int i = 1; i <= n; i++) { if (i & 1)b[i] = a[q++]; else b[i] = a[p++]; } int ans = 0; for (int i = 2; i < n; i++)if (b[i] < b[i - 1] && b[i] < b[i + 1])ans++; printf("%d\n", ans); for (int i = 1; i <= n; i++)printf("%d%c", b[i], " \n"[i == n]); return0; }
E. Decryption
题意:给定 n,把 n 的所有大于 1 的因数排成一个圆,如果相邻的两个数互质,则在它们中间插入它们的LCM,要最小化插入次数,求排列。
dfs
atcoder做过类似的一道题。把所有因子排列成圆,使得相邻因子不互质。
本题类似,只要 n 不是两个不同质数的乘积,则必然可以使得插入次数为 0.
设 n 的各个质因子的幂次为 c[i]={2,2,2},则枚举方式为 [0,0,0],[0,0,1],[0,0,2],[0,1,2],[0,1,1],[0,1,0],[0,2,0],[0,2,1],[0,2,2],[1,2,0],[1,2,1]⋯.