题目描述

数据范围

解法

由于大于4的素数只有可能由奇数和偶数的和得出。

所以根据数的奇偶性可以分出两类数奇数和偶数。

奇数之间不会相互匹配,偶数之间也不会相互匹配。

那么原问题转化为二分图最大匹配。

网络流即可。

代码

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm> using namespace std;
const char* fin="prime.in";
const char* fout="prime.out";
const int inf=0x7fffffff;
const int maxn=207,maxa=2007;
int n,i,j,k,ans=0,en,ls,rs;
int a[maxn],c[maxa];
int b[maxn];
int tot=1,fi[maxn],la[maxa],va[maxa],ne[maxa],cnt[maxn],bz[maxn];
int gg(int x){
return 1+x;
}
void add_line(int a,int b,int c){
tot++;
ne[tot]=fi[a];
la[tot]=b;
va[tot]=c;
fi[a]=tot;
}
void add(int a,int b){
add_line(a,b,1);
add_line(b,a,0);
}
int gap(int v,int flow){
int i,use=0,k;
if (v==en) return flow;
for (k=fi[v];k;k=ne[k])
if (bz[v]==bz[la[k]]+1 && va[k]){
i=gap(la[k],min(flow-use,va[k]));
use+=i;
va[k]-=i;
va[k^1]+=i;
if (use==flow || bz[1]==en) return use;
}
if (!--cnt[bz[v]]) bz[1]=en;
cnt[++bz[v]]++;
return use;
}
bool p[maxa];
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
for (i=2;i<maxa;i++){
if (!p[i]) c[++c[0]]=i;
for (j=1;j<=c[0];j++){
if (i*c[j]>=maxa) break;
p[i*c[j]]=true;
if (i%c[j]==0) break;
}
}
scanf("%d",&n);
en=2+n;
for (i=1;i<=n;i++){
scanf("%d",&a[i]);
if (a[i]%2) add(1,gg(i));
else add(gg(i),en);
}
for (i=1;i<=n;i++) for (j=1;j<=n;j++)
if (a[i]%2==1 && a[j]%2==0 && !p[a[i]+a[j]]) add(gg(i),gg(j));
cnt[0]=en;
while (bz[1]<en) ans+=gap(1,inf);
printf("%d",ans);
return 0;
}

启发

原本的想法就是网络流,但发现一次匹配会用去两个数的使用次数。

并没有注意到大于四的素数只能由偶数和奇数的和得到这个性质。

两两匹配问题考虑把原数集分为两个独立集。


这道题似乎还可以贪心,脑洞较小无法想出。

想点办法打开脑洞。

【JZOJ4832】【NOIP2016提高A组集训第3场10.31】高维宇宙的更多相关文章

  1. 【NOIP2016提高A组集训第3场10.31】高维宇宙

    题解 分析 因为只有奇数和偶数配对才有可能得出质数, 暴力求出每一对\(a_i+a_j\)为质数,将其中的奇数想偶数连一条边. 二分图匹配,匈牙利算法. #include <cmath> ...

  2. 【JZOJ4831】【NOIP2016提高A组集训第3场10.31】方程式

    题目描述 数据范围 解法 枚举根之后,使用大除法. 代码 #include<stdio.h> #include<iostream> #include<string.h&g ...

  3. 【JZOJ4833】【NOIP2016提高A组集训第3场10.31】Mahjong

    题目描述 解法 搜索. 代码 #include<stdio.h> #include<iostream> #include<string.h> #include< ...

  4. 【JZOJ4824】【NOIP2016提高A组集训第1场10.29】配对游戏

    题目描述 流行的跳棋游戏是在一个有m*n个方格的长方形棋盘上玩的.棋盘起初全部被动物或障碍物占满了.在一个方格中,'X'表示一个障碍物,一个'0'-'9'的个位数字表示一个不同种类的动物,相同的个位数 ...

  5. 【NOIP2016提高A组集训第1场10.29】配对游戏

    题目 流行的跳棋游戏是在一个有mn个方格的长方形棋盘上玩的.棋盘起初全部被动物或障碍物占满了.在一个方格中,'X'表示一个障碍物,一个'0'-'9'的个位数字表示一个不同种类的动物,相同的个位数字表示 ...

  6. 【NOIP2016提高A组集训第1场10.29】完美标号

    题目 给定M个二元组(A_i, B_i),求X_1, ..., X_N满足:对于任意(A_i, B_i),有|X_{A_i} - X_{B_i}| = 1成立. 分析 显然,对于二元组(x,y),X_ ...

  7. JZOJ 【NOIP2016提高A组集训第16场11.15】兔子

    JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...

  8. JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线

    JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...

  9. 【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...

随机推荐

  1. java求1000以内的水仙花数

    水仙花数是指一个 n 位数 ( n>=3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153) 三位的水仙花数共有4个,分别为:153.370. ...

  2. apache支持多主机头,并防止恶意空主机头的配置实现

    首先,需要启用 LoadModule vhost_alias_module modules/mod_vhost_alias.so # Virtual hostsInclude conf/extra/h ...

  3. JasperReports报表字段11

    报表字段是代表数据源和报表模板之间的数据映射元素.字段可以在报告中的表达式进行组合,以获得所需的输出.报表模板可以包含零个或更多的<field>元素.当声明报表字段,数据源应提供相应的数据 ...

  4. Liferay 7:Liferay内部博客地址

    想要了解Liferay最新功能和特性,可以看一看. 非常实用,都是Liferay开发者写的: https://web.liferay.com/zh/community/blogs/all

  5. spring源码学习之AOP(二)

    接着上一篇中的内容! 3.创建代理 在获取了所有的bean对应的增强器之后,便可以进行代理的创建了org.springframework.aop.framework.autoproxy包下的Abstr ...

  6. 用canvas 画出圆形图片

    /** * 把图片处理成圆形,如果不是正方形就按最小边一半为半径处理 * @param {object} imgObj 图片(img)对象 * @param {number} imgType 设置生成 ...

  7. bootstrap--栅格系统布局

    栅格布局使用例子: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  8. freopen() 函数的使用

    当我们求解acm题目时,通常在设计好算法和程序后,要在调试环境(例如VC等)中运行程序,输入测试数据,当能得到正确运行结果后,才将程序提交到oj中.但由于调试往往不能一次成功,每次运行时,都要重新输入 ...

  9. Idea代理设置与Java程序的代理设置

    最近在学习WebService的过程中,为了弄清楚发送和接收的包的数据结构,使用Fiddler抓取包的数据.开始先配置了Idea的代理设置,但执行Java代码发送请求时,依然无法在Fiddler中抓取 ...

  10. python使用cPickle模块序列化实例

    python使用cPickle模块序列化实例 这篇文章主要介绍了python使用cPickle模块序列化的方法,是一个非常实用的技巧,本文实例讲述了python使用cPickle模块序列化的方法,分享 ...