记录编号 481087 评测结果 AAAAAAAAAA
题目名称 [网络流24题]魔术球问题(简化版) 最终得分 100
用户昵称 Gravatarnonamenotitle 是否通过 通过
代码语言 C++ 运行时间 1.952 s
提交时间 2017-12-31 22:03:07 内存使用 3.98 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int maxn=65;
int head[5000+5],eg[100000+5],nxt[100000+5],tot=0,n;
void addedge(int u,int v)
{
    eg[++tot]=v;nxt[tot]=head[u];head[u]=tot;
}
int vis[5000+5],mth[5000+5];
bool dfs(int u)
{
    for(int i=head[u];i;i=nxt[i]) {
        int v=eg[i];
        if(!vis[v]) {
            vis[v]=true;
            if(!mth[v] || dfs(mth[v])) {
                mth[v]=u;
                return true;
            }
        }
    }
    return false;
}
bool jud(int x){return ((int)sqrt(x))*((int)sqrt(x))==x;}
int cal(int N)
{
    memset(head,0,sizeof(head));tot=0;
    for(int i=1;i<=N;i++)
        for(int j=i+1;j<=N;j++) {
            if(jud(i+j)) {
                addedge(i,j);
            }
        }
    int ans=0;
    memset(mth,0,sizeof(mth));
    for(int i=1;i<=N;i++) {
        memset(vis,0,sizeof(vis));
        assert(i<=1600);
        if(dfs(i)) ans++;
    }
    return N-ans;
}
int main()
{
    freopen("balla.in","r",stdin);
    freopen("balla.out","w",stdout);
    scanf("%d",&n);
    int L=1,R=1605;
    while(L<=R) {
        int mid=(L+R)>>1;
        if(cal(mid)>n) R=mid-1;
        else L=mid+1;
    }
    printf("%d\n",R);
    return 0;
}