第六届传智杯第五题 kotori和素因子

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网

题目描述

kotori拿到了一些正整数。她决定从每个正整数取出一个素因子。但是,kotori有强迫症,她不允许两个不同的正整数取出相同的素因子。

她想知道,最终所有取出的数的和的最小值是多少?

注:若 a mod k==0 ,则称 kkk 是 aaa 的因子。若一个数有且仅有两个因子,则称其是素数。显然1只有一个因子,不是素数。

输入描述:

第一行一个正整数 nnn ,代表kotori拿到正整数的个数。
第二行共有 nnn 个数 aia_iai​,表示每个正整数的值。
保证不存在两个相等的正整数。

输出描述:

一个正整数,代表取出的素因子之和的最小值。若不存在合法的取法,则输出-1。

示例1

输入

4
12 15 28 22

输出

17

说明

分别取3,5,7,2,可保证取出的数之和最小  

示例2

输入

5
4 5 6 7 8

输出

-1

比赛前坐了两个小时车,开始比赛二十分钟了才进去比赛,前面几题比较简单,但卡在这题,就有一种很简单的感觉,总之就是通过素数筛找到所有素数,然后遍历一下得到所有数的素因数,结果一直卡在最后一步,不知道怎么从每个数组中取一个不重复的数使得答案最小,当时真是做迷糊了,感觉很简单很熟悉,但就是写不出来,一看数据规模也很小,就是暴力不出来,结果后来才想起来自己以前最擅长的dfs.... 当时是一点都想不起来,连dfs都忘了。

 ac代码

#include <bits/stdc++.h>
#include <cstring>
#include <unordered_map>
using namespace std;
int n, arr[110];
int s[10010];
int b[10010];
int cnt = 1;
int ans = 999999999;
unordered_map<int, vector<int>> mpp;
void dfs(int x, int y, unordered_map<int, int> mp) {
	if (x > n) {
		if (mp.size() == n ) ans = min(ans, y);
		return;
	}
	for (int i = 0; i < mpp[arr[x]].size(); i++) {
		int f = mpp[arr[x]][i];
		if (mp[f] > 0) continue;
		else {
			mp[f]++;
			dfs(x + 1, y + f, mp);
			mp[f]--;
			mp.erase(f);
		}
	}
	return;
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> arr[i];
	for (int i = 2; i <= 1000; i++) {
		if (b[i] == 0)
			s[cnt++] = i;
		for (int j = i + i; j < 1000; j += i) {
			b[j] = 1;
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; s[j] <= arr[i]; j++) {
			if (arr[i] % s[j] == 0) {
				mpp[arr[i]].push_back(s[j]);
			}
		}
	}
	for (int i = 0; i < mpp[arr[1]].size(); i++) {
		unordered_map<int, int> mp;
		mp[mpp[arr[1]][i]]++;
		dfs(2, mpp[arr[1]][i], mp);
	}

	if (ans == 999999999) cout << -1;
	else	cout << ans;

}

总之就是非常懊悔。。 

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第六届传智杯B组初赛是传智播客举办的一次IT技术竞赛的初赛阶段,旨在选拔出各高校优秀的程序设计人才。该比赛中,参赛者将面临多道编程目,通过编写程序解决问来展示他们的技术水平和创新能力。 在初赛中,参赛者需要在规定的时间内完成多道程序设计目。这些目可能涉及数据结构、算法、网络通信等方面的知识,要求参赛者具备扎实的编程基础和解决实际问的能力。 参赛者需要在规定的时间内完成编程目,并提交给评委进行评分。评委会根据答案的正确性、效率、代码的可读性等方面对参赛者的作品进行综合评判。最终,得分高的参赛者将进入下一轮比赛。 第六届传智杯B组初赛的目的是为了选拔出具备优秀编程能力的学生,为他们提供一个展示才华、学习交流的平台。参赛者不仅可以通过比赛锻炼自己的编程技巧,还可以结识其他优秀的参赛者,相互学习、切磋技艺。 在比赛过程中,参赛者还可以通过与其他选手交流,了解各种不同的编程思路和解方法,不断提高自己的编程水平。同时,参赛者还有机会与业界的专家学者进行交流,了解最新的技术动态和发展趋势。 总之,第六届传智杯B组初赛是一次很有意义的编程竞赛,为各大高校的IT人才选拔提供了一次难得的机会。通过比赛,参赛者可以展现自己的才华,提升技术水平,同时也可以与其他优秀选手进行交流,共同进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值