bzoj3275 Number

来源:互联网 发布:自动刷弹幕软件 编辑:程序博客网 时间:2024/06/01 09:34

(http://www.elijahqi.win/2017/12/25/bzoj3275-number/)
Description

有N个正整数,需要从中选出一些数,使这些数的和最大。
若两个数a,b同时满足以下条件,则a,b不能同时被选
1:存在正整数C,使a*a+b*b=c*c
2:gcd(a,b)=1
Input
第一行一个正整数n,表示数的个数。
第二行n个正整数a1,a2,?an。

Output
最大的和。

Sample Input
5
3 4 5 6 7

Sample Output
22

HINT

n<=3000。
Source

网络流

建图要正确 我们可以知道 奇数的平方一定是%8==2偶数的一定互不满足gcd(a,b)==1那么 所以产生不满足的一定是奇数和偶数之间 那么画一画样例可以发现我可以把奇数放在左边 偶数放在右边 然后如果这两个不成立 就说明要割开那么就连一条inf的边 然后跑最小割即可

#include<cmath>#include<queue>#include<cstdio>#include<cstring>#include<algorithm>#define N 3300#define inf 0x3f3f3f3fusing namespace std;inline char gc(){    static char now[1<<16],*S,*T;    if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}    return *S++;}inline int read(){    int x=0;char ch=gc();    while(ch<'0'||ch>'9') ch=gc();    while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=gc();}    return x; }struct node{    int x,y,z,next;}data[5000000];int n,T,h[N],level[N],a[N],num=1;inline void insert1(int x,int y,int z){    data[++num].y=y;data[num].z=z;data[num].next=h[x];h[x]=num;data[num].x=x;    data[++num].y=x;data[num].z=0;data[num].next=h[y];h[y]=num;data[num].x=y;}inline bool judge(int x,int y){    int sum=x*x+y*y;int s=sqrt(sum);if (s*s!=sum) return 0;else return 1;}inline bool bfs(){    memset(level,0,sizeof(level));level[0]=1;queue<int>q;q.push(0);    while(!q.empty()){        int x=q.front();q.pop();        for (int i=h[x];i;i=data[i].next){            int y=data[i].y,z=data[i].z;            if (level[y]||!z) continue;level[y]=level[x]+1;q.push(y);if (y==T) return 1;         }    }return 0;}inline int dfs(int x,int s){    if (x==T)return s;int ss=s;    for (int i=h[x];i;i=data[i].next){        int y=data[i].y,z=data[i].z;        if (level[x]+1==level[y]&&z){            int xx=dfs(y,min(s,z));if (!xx) level[y]=0;            s-=xx;data[i].z-=xx;data[i^1].z+=xx;if (!s) return ss;        }    }return ss-s;}inline int gcd(int x,int y){    if (y==0) return x;return gcd(y,x%y);}int main(){    freopen("bzoj3275.in","r",stdin);    int sum=0;n=read();for (int i=1;i<=n;++i) a[i]=read(),sum+=a[i];T=n+1;    for (int i=1;i<=n;++i) if (a[i]%2) insert1(0,i,a[i]);else insert1(i,T,a[i]);    //for (int i=1;i<=n;++i) if (a[i]%2) insert1(0,i,inf);else insert1(i,T,a[i]);    for (int i=1;i<=n;++i){        for (int j=1;j<=n;++j) {            if (i==j) continue;if (a[i]%2==0) continue;if (a[j]%2==1) continue;            if (gcd(a[i],a[j])!=1) continue;if (!judge(a[i],a[j]))continue;            insert1(i,j,inf);        }    }    //for (int i=2;i<=num;++i) printf("%d %d %d\n",data[i].x,data[i].y,data[i].z);    int ans=0;while(bfs()) ans+=dfs(0,inf);printf("%d",sum-ans);    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不了缘 孤缘 因为缘 今缘 原来你是这样的人 聚香缘 郑缘缘 来就来 原来英文 皆缘 福缘满田 云若惜 宸汐缘灵汐身世 宸汐缘灵汐身份 缘由 缘由的意思 缘由拼音 缘由的拼音 个中缘由 2019全面禁止基督教缘由 2018全面禁止基督教缘由 花莲石梯缘景观咖啡民宿 聚散皆是缘 缘聚神途手机版 梓潼聚缘大酒店 仁化县聚缘酒店 聚福缘 聚香缘过桥米线 额尔古纳聚缘山庄 聚缘 绿缘萝这个牌子怎么样 绿缘萝 缘觉 缘起 缘起缘灭 白蛇缘起免费观看完整版 白蛇缘起在线播放完整 白蛇缘起2 白蛇缘起第二部 白蛇缘起片尾曲 白蛇缘起完整免费看 缘起近义词