Codeforces Gym 104059B - Breeding Bugs
2024-10-20 11:51:10
简要题意
Virtual Judge 传送门 | Codeforces Gym 传送门
给出一个长度为 \(n\) 的序列 \(a\),你需要从中选出一些数,使其两两相加不为质数。输出最大可以选择多少个数。
\(1 \leq n \lt 750,1 \leq a_i \lt 10^7\)
思路
Imakf 学长推荐的题。
首先我们发现,如果对于任意两个数 \(a_i,a_j\),如果 \((a_i+a_j)\in\mathbb{P}\),连边 \((i,j)\)。然后答案就是图的最大独立集。但是一般图最大独立集是 NP-Complete 问题,目前没有多项式时间复杂度解法。
考虑到若 \(a_i,a_j\neq 1\),那么若 \((a_i+a_j)\in\mathbb{P}\),则 \(a_i\bmod 2\neq b_i\bmod 2\)。则若满足上述条件连边,就一定得到的是二分图。
好,然后跑二分图最大匹配,最后将二分图最大匹配转换成二分图最大独立集即可。
等一下,\(a_i=a_j=1\) 的问题我们没有解决,由于如果独立集中有两个及以上 \(1\) 就一定会有质数和出现(\(1+1=2,2\in\mathbb{P}\)),所以我们对值为 \(1\) 的 \(a_i\) 去重即可。
使用匈牙利算法求解二分图最大匹配,时间复杂度均摊 \(O(\max a+n\cdot\frac{n^2}{\log n})\)(这个复杂度是我用素数定理乱算的),理论复杂度上界 \(O(\max a+n^3)\)。可以通过本题。
(思路不难,细节贼多)
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int pri[20000005];
bool vis[20000005];
int tot;
int n,p[800];
struct edge{
int nxt,to;
} g[10000005];
int head[800],ec;
void add(int u,int v){
g[++ec].nxt=head[u];
g[ec].to=v;
head[u]=ec;
}
int vist[800],mch[800];
bool hungry(int u,int tag){
if(vist[u]==tag) return false;
vist[u]=tag;
for(int i=head[u];i;i=g[i].nxt){
int v=g[i].to;
if(mch[v]==0||hungry(mch[v],tag)){
mch[v]=u;
return true;
}
}
return false;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
vis[1]=1;vis[0]=1;
for(int i=2;i<=(2e7);i++){
if(!vis[i]){
pri[++tot]=i;
}
for(int j=1;j<=tot&&i*pri[j]<=(2e7);j++){
vis[i*pri[j]]=1;
if(!(i%pri[j]))break;
}
}
for(int i=1;i<=n;i++) cin>>p[i];
sort(p+1,p+n+1, greater<int>());
if(p[n]==1){
while(p[n]==1) n--;
n++;
}
for(int i=1;i<=n;i++){
if(!(p[i]&1)) continue;
for(int j=1;j<=n;j++){
if((p[j]&1)) continue;
if(!vis[p[i]+p[j]]) {
add(i,j);
}
}
}
int ret=0;
for(int i=1;i<=n;i++){
if(hungry(i,i)) ret++;
}
cout<<(n-ret);
}
AC Record on Virtual Judge | Codeforces Gym AC 记录 ID:\(188853866\)
最新文章
- 生成随机id对比
- 【转】单例模式(singletion)
- 关于VR边纹理材质的渲染
- jQuery基础之(四)jQuery创建DOM元素
- Python多进程(1)——subprocess与Popen()
- 1989-C. 数字三角形
- 关于";干货集中营";的一个开源App
- c# winform实现网页上用户自动登陆,模拟网站登录
- HTML编辑器UEditor的简单使用
- 论MySQL数据库中两种数据引擎的差别
- Innobackupex全备恢复(原理、演示)
- hadoop2.6环境中部署hive1.2.2的错误
- 关于php变量的赋值和引用的区别
- centos7.6环境下编译安装tengine-2.2.2的编译安装
- 廖雪峰Java8JUnit单元测试-2使用JUnit-1使用Before和After
- 跑步“无核心,不PB”
- springboot创建错误
- POJ-3268.SilverCowParty.(最短路 + 图的转置)
- MT【59】一道迭代函数作图
- cocos2d-x JS 随机数
热门文章
- 小程序 wx.navigateTo和 wx.redirectTo区别
- Vue学习之--------Vue生命周期beforeCreate、created、beforeMount、mounted、beforeDestroy 。。。(图解详细过程)(2022/7/17)
- 云原生分布式 PostgreSQL+Citus 集群在 Sentry 后端的实践
- 如何通过 C#/VB.NET 重命名 Excel 表格并设置选项卡颜色
- Django系列---理论一
- webpack -- element-ui 的按需引入
- echarts标题(title)配置
- SpringCloud(七) - 微信支付
- mysql是如何实现mvcc的
- C语言嵌套for循环实现冒泡排序