记录编号 |
154341 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[网络流24题]魔术球问题(简化版) |
最终得分 |
100 |
用户昵称 |
RP++ |
是否通过 |
通过 |
代码语言 |
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);
}