3275: Number

3275: Number

Time Limit: 10 Sec   Memory Limit: 128 MB
Submit: 918   Solved: 392
[ Submit][ Status][ Discuss]

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

[ Submit][ Status][ Discuss]

有个直观的感受这是张二分图
偶数之间肯定不能满足第二个限制
奇数之间的话,,打个表就发现找不到呀。。。。。
据说不存在这样的勾股数???反正按奇偶分开就行了
于是就可以跑网络流啦。。。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<bitset>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
 
const int maxn = 3030;
const int maxm = maxn * maxn;
const int INF = ~0U>>1;
typedef long long LL;
 
struct E{
    int to,cap,flow; E(){}
    E(int to,int cap,int flow):
        to(to),cap(cap),flow(flow){}
}edgs[maxm];
 
int n,S,T,cnt,Ans,cur[maxn],L[maxn],A[maxn];
 
vector <int> v[maxn];
queue <int> Q;
 
int gcd(int x,int y) {return !y ? x : gcd(y,x % y);}
 
void Add(int x,int y,int cap)
{
    v[x].push_back(cnt); edgs[cnt++] = E(y,cap,0);
    v[y].push_back(cnt); edgs[cnt++] = E(x,0,0);
}
 
bool Check(int x,int y)
{
    if (gcd(x,y) != 1) return 0;
    LL z = 1LL * x * x + 1LL * y * y;
    LL tmp = sqrt(z); return tmp * tmp == z;
}
 
bool BFS()
{
    for (int i = 0; i <= T; i++) L[i] = 0;
    Q.push(S); L[S] = 1;
    while (!Q.empty())
    {
        int k = Q.front(); Q.pop();
        for (int i = 0; i < v[k].size(); i++)
        {
            E e = edgs[v[k][i]];
            if (e.cap == e.flow || L[e.to]) continue;
            L[e.to] = L[k] + 1; Q.push(e.to);
        }
    }
    return L[T];
}
 
int Dinic(int x,int a)
{
    if (x == T) return a; int flow = 0;
    for (int &i = cur[x]; i < v[x].size(); i++)
    {
        E &e = edgs[v[x][i]];
        if (e.cap == e.flow || L[e.to] != L[x] + 1) continue;
        int f = Dinic(e.to,min(e.cap - e.flow,a));
        if (!f) continue; flow += f; e.flow += f;
        edgs[v[x][i]^1].flow -= f; a -= f;
        if (!a) return flow;
    }
    if (!flow) L[x] = -1; return flow;
}
 
int getint()
{
    char ch = getchar(); int ret = 0;
    while (ch < '0' || '9' < ch) ch = getchar();
    while ('0' <= ch && ch <= '9')
        ret = ret * 10 + ch - '0',ch = getchar();
    return ret;
}
 
int main()
{
    #ifdef DMC
        freopen("DMC.txt","r",stdin);
    #endif
     
    n = getint(); T = n + 1;
    for (int i = 1; i <= n; i++)
    {
        A[i] = getint();
        if (A[i] & 1) Add(S,i,A[i]);
        else Add(i,T,A[i]); Ans += A[i];
    }
    for (int i = 1; i <= n; i++)
    {
        if (!(A[i] & 1)) continue;
        for (int j = 1; j <= n; j++)
        {
            if (A[j] & 1) continue;
            if (Check(A[i],A[j])) Add(i,j,INF); 
        }
    }
     
    while (BFS())
    {
        for (int i = S; i <= T; i++) cur[i] = 0;
        Ans -= Dinic(S,INF);
    }
    cout << Ans << endl;
    return 0;
}


Process: com.android.systemui, PID: 12501 C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4200010 (has extras) } in com.android.systemui.qsview.signal.SignalUtils$1@dbb3275 C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$android-app-LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1830) C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: at android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(Unknown Source:2) C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:942) C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99) C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:201) C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: at android.os.Looper.loop(Looper.java:288) C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8061) C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:703) C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911) C1C4B8B 06-09 16:11:31.132 12501 12501 E AndroidRuntime: Caused by: java.lang.IllegalStateException: Pid 12501 has exceeded the number of permissible registered listeners. Ignoring request to add.
最新发布
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值