记录编号 154341 评测结果 AAAAAAAAAA
题目名称 [网络流24题]魔术球问题(简化版) 最终得分 100
用户昵称 GravatarRP++ 是否通过 通过
代码语言 C++ 运行时间 1.044 s
提交时间 2015-03-22 11:11:56 内存使用 1.09 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

int tot=1;
int to[100000],next[100000],head[1600],pre[1600];
bool vis[1600];

void Build(int s,int t) {
	to[++tot]=t,next[tot]=head[s],head[s]=tot;
}

void BuildMap(int f) {
	memset(head,0,sizeof(head)); tot=0;
	for(int i=1;i<=f;i++)
		for(int j=i+1;j<=f;j++) {
			int tmp=sqrt(i+j);
			if(tmp*tmp==i+j) Build(i,j);
		}
}

bool find(int x) {
	for(int i=head[x];i;i=next[i]) {
		if(!vis[to[i]]) {
			vis[to[i]]=true;
			if(!pre[to[i]]||find(pre[to[i]])) {
				pre[to[i]]=x; return 1;
			}
		}
	}
	return 0;
}

int solve(int f) {
	memset(pre,0,sizeof(pre));
	int ans=0;
	for(int i=1;i<=f;i++) {
		memset(vis,0,sizeof(vis));
		if(find(i)) ans++;
	}
	return f-ans;
}

int main() {
	freopen("balla.in","r",stdin);
	freopen("balla.out","w",stdout);
	int n;
	scanf("%d",&n);
	int l=1,r=1600,mid;
	while(l<=r) {
		mid=(l+r)>>1;
		BuildMap(mid);
		if(solve(mid)<=n) l=mid+1;
		else r=mid-1;
	}
	printf("%d",r);
}