首页 > 其他分享 >洛谷 P7023

洛谷 P7023

时间:2022-10-27 19:24:34浏览次数:64  
标签:P7023 const v1 int 公倍数 洛谷

首先可以发现一些有用的性质:

  • 每个数至多操作一次
  • 如果一个数,在原数列中有它的倍数,那么改变成那个数一定是最优的。否则可以改变成所有数的最小公倍数。

贪心的,按出现次数从小到大依次改。

对两种情况分别跑一次,取个 \(\min\)。

Code:

#include <bits/stdc++.h>
using namespace std;
const int N = 300005, M = 1000005;
int n, m, cnt;
int a[N], ans[N];
int vis[M];
vector <int> v1, v2;

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
		if (!vis[a[i]]) ++cnt; ++vis[a[i]];
	}
	sort(a + 1, a + n + 1), m = unique(a + 1, a + n + 1) - (a + 1);
	memset(ans, 0x3f, sizeof ans), ans[0] = cnt;
	for (int i = 1; i <= m; ++i) {
		v2.push_back(vis[a[i]]);
		for (int j = a[i] * 2; j <= 1000000; j += a[i]) {
			if (vis[j]) {
				v1.push_back(vis[a[i]]);
				break;
			}
		}
	}
	sort(v1.begin(), v1.end()), sort(v2.begin(), v2.end());
	int cur = 0;
	for (int i = 0; i < v1.size(); ++i) {
		cur += v1[i];
		ans[cur] = min(ans[cur], cnt - i - 1);
	}
	cur = 0;
	for (int i = 0; i < v2.size(); ++i) {
		cur += v2[i];
		ans[cur] = min(ans[cur], cnt - i);
	}
	printf("%d ", ans[0]);
	for (int i = 1; i <= n; ++i) printf("%d ", ans[i] = min(ans[i], ans[i - 1]));
	return 0;
}

标签:P7023,const,v1,int,公倍数,洛谷
From: https://www.cnblogs.com/Kobe303/p/16833406.html

相关文章

  • 洛谷P3225 [HNOI2012]矿场搭建
    SLOJH7136.「HNOI2012」矿场搭建题目描述煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援......
  • 洛谷 P8595 「KDOI-02」一个网的路 蓝 题解
    定义树形\(DP\),这个挺明显的,我认为\(DP\)让读者理解的最重要的一步是:定义。所以我先详细说明\(f\)数组的定义,至于为什么这么定义后面再讲。\(f_{u,type}\),其中\(......
  • 洛谷 P3592
    首先不难发现最终答案中只会出现\(c_i\)中的数,所以可以将\(c_i\)离散化。设\(f_{i,j,k}\)表示区间\([l,r]\),最小值不小于\(k\)的最大收益,\(cnt_{i,j}\)表示区间......
  • 洛谷P1021题解
    原题P1021[NOIP1999提高组]邮票面值设计思路概述题意分析给定两个整数\(N,K(N+K≤15)\),设计\(K\)种邮票面值\(\{a_1,a_2\dotsa_K\}\),并用共\(N\)张上述邮票......
  • 洛谷P1064题解
    原题P1064[NOIP2006提高组]金明的预算方案思路概述题意分析给定一个体积为\(n\)的背包和\(m\)个物品。每个物品通过\((\text{价值},\text{体积})\)的形式表......
  • 洛谷 P7003
    考虑当左端点固定时,区间的\(\&\)和至多有\(\logw\)种,因为\(1\)的数量是单调不升的。所以我们可以枚举区间左端点\(i\),然后ST表预处理区间\(\&\)和+二分求出......
  • 洛谷P2512 [HAOI2008]糖果传递
    SLOJP1117.糖果传递题目描述有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为11。输入格式小朋友个数n,下面n行ai​......
  • 洛谷 P6453
    设第\(i\)列高\(h_i\),建立序列\(h_i\)的小根笛卡尔树,然后树形DP。发现这样就将原来不规整的图形剖分成若干个矩形:我们发现,这样构成的若干个矩形正好对应小根笛卡......
  • 洛谷优秀油猴插件推荐
    前言转载自眭然的博客,有改编和新增下载链接油猴zip1.先打开edge浏览器的扩展(其他浏览器应该也可以加扩展,不过edge最好)2.打开开发者模式和允许来自其他应用商店的......
  • 洛谷 P6223
    树形DP完全不会。。首先将题目条件改一下:每个人有\(x-v_i\)块钱,要求使所有人的钱数非负的最小操作次数。注意到对于节点\(u\),在子树\(u\)内至多操作\(siz_u-1\)......