【BZOJ-3275&3158】Number&千钧一发 最小割
3275: Number
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 748 Solved: 316
[Submit][Status][Discuss]
Description
有N个正整数,需要从中选出一些数,使这些数的和最大。
若两个数a,b同时满足以下条件,则a,b不能同时被选
1:存在正整数C,使a*a+b*b=c*c
2:gcd(a,b)=1
Input
Output
Sample Input
3 4 5 6 7
Sample Output
HINT
n<=3000。
Source
3158: 千钧一发
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 984 Solved: 359
[Submit][Status][Discuss]
Description
.jpg)
Input
第一行一个正整数N。
第二行共包括N个正整数,第 个正整数表示Ai。
第三行共包括N个正整数,第 个正整数表示Bi。
Output
共一行,包括一个正整数,表示在合法的选择条件下,可以获得的能量值总和的最大值。
Sample Input
3 4 5 12
9 8 30 9
Sample Output
HINT
1<=N<=1000,1<=Ai,Bi<=10^6
Source
Solution
一开始没仔细读题,看成同时满足两个,WA了几波后才发现看错了...
对奇数偶数讨论一下,奇数之间肯定满足1.偶数之间肯定满足2
最小割就好
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
int Gcd(int a,int b)
{
if (b==) return a; else return Gcd(b,a%b);
}
bool check(long long a,long long b)
{
if (Gcd(a,b)>) return true;
long long T=sqrt(a*a+b*b); if (T*T!=a*a+b*b) return true;
return false;
}
#define maxn 5000
#define maxm 1000010
int N,A[maxn],B[maxn],tot;
struct Edgenode{int next,to,cap;}edge[maxm];
int head[maxn],cnt=;
void add(int u,int v,int w)
{
cnt++;
edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v; edge[cnt].cap=w;
}
void insert(int u,int v,int w) {add(u,v,w); add(v,u,);}
int cur[maxn],dis[maxn],S,T;
bool bfs()
{
queue<int> q;
memset(dis,-,sizeof(dis));
q.push(S); dis[S]=;
while (!q.empty())
{
int now=q.front(); q.pop();
for (int i=head[now]; i; i=edge[i].next)
if (edge[i].cap && dis[edge[i].to]==-)
dis[edge[i].to]=dis[now]+,q.push(edge[i].to);
}
return dis[T]!=-;
}
int dfs(int loc,int low)
{
if (loc==T) return low;
int w,used=;
for (int i=cur[loc]; i; i=edge[i].next)
if (edge[i].cap && dis[edge[i].to]==dis[loc]+)
{
w=dfs(edge[i].to,min(low-used,edge[i].cap));
edge[i].cap-=w; edge[i^].cap+=w; used+=w;
if (edge[i].cap) cur[loc]=i; if (used==low) return low;
}
if (!used) dis[loc]=-;
return used;
}
#define inf 0x7fffffff
int dinic()
{
int tmp=;
while (bfs())
{
for (int i=S; i<=T; i++) cur[i]=head[i];
tmp+=dfs(S,inf);
}
return tmp;
}
void Build()
{
S=,T=N+;
for (int i=; i<=N; i++)
if ((A[i]%)) insert(S,i,A[i]); else insert(i,T,A[i]);
for (int i=; i<=N; i++)
for (int j=; j<=N; j++)
if ((A[i]%) && !(A[j]%) && !check(A[i],A[j]))
insert(i,j,inf);
}
int main()
{
N=read();
for (int i=; i<=N; i++) A[i]=read(),tot+=A[i];
//for (int i=1; i<=N; i++) B[i]=read(),tot+=B[i];
Build();
int maxflow=dinic();
printf("%d\n",tot-maxflow);
return ;
}
BZOJ-3275
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
int Gcd(int a,int b)
{
if (b==) return a; else return Gcd(b,a%b);
}
bool check(long long a,long long b)
{
if (Gcd(a,b)>) return true;
long long T=sqrt(a*a+b*b); if (T*T!=a*a+b*b) return true;
return false;
}
#define maxn 3000
#define maxm 1000010
int N,A[maxn],B[maxn],tot;
struct Edgenode{int next,to,cap;}edge[maxm];
int head[maxn],cnt=;
void add(int u,int v,int w)
{
cnt++;
edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v; edge[cnt].cap=w;
}
void insert(int u,int v,int w) {add(u,v,w); add(v,u,);}
int cur[maxn],dis[maxn],S,T;
bool bfs()
{
queue<int> q;
memset(dis,-,sizeof(dis));
q.push(S); dis[S]=;
while (!q.empty())
{
int now=q.front(); q.pop();
for (int i=head[now]; i; i=edge[i].next)
if (edge[i].cap && dis[edge[i].to]==-)
dis[edge[i].to]=dis[now]+,q.push(edge[i].to);
}
return dis[T]!=-;
}
int dfs(int loc,int low)
{
if (loc==T) return low;
int w,used=;
for (int i=cur[loc]; i; i=edge[i].next)
if (edge[i].cap && dis[edge[i].to]==dis[loc]+)
{
w=dfs(edge[i].to,min(low-used,edge[i].cap));
edge[i].cap-=w; edge[i^].cap+=w; used+=w;
if (edge[i].cap) cur[loc]=i; if (used==low) return low;
}
if (!used) dis[loc]=-;
return used;
}
#define inf 0x7fffffff
int dinic()
{
int tmp=;
while (bfs())
{
for (int i=S; i<=T; i++) cur[i]=head[i];
tmp+=dfs(S,inf);
}
return tmp;
}
void Build()
{
S=,T=N+;
for (int i=; i<=N; i++)
if ((A[i]%)) insert(S,i,B[i]); else insert(i,T,B[i]);
for (int i=; i<=N; i++)
for (int j=; j<=N; j++)
if ((A[i]%) && !(A[j]%) && !check(A[i],A[j]))
insert(i,j,inf);
}
int main()
{
N=read();
for (int i=; i<=N; i++) A[i]=read();
for (int i=; i<=N; i++) B[i]=read(),tot+=B[i];
Build();
int maxflow=dinic();
printf("%d\n",tot-maxflow);
return ;
}
BZOJ-3158
【BZOJ-3275&3158】Number&千钧一发 最小割的更多相关文章
- bzoj 3158 千钧一发 —— 最小割
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3158 \( a[i] \) 是奇数则满足条件1,是偶数则显然满足条件2: 因为如果把两个奇数 ...
- bzoj 3275 Number(最小割)
[题意] 给定n个数,要求选出一些数满足 1.存在c,a*a+b*b=c*c 2.gcd(a,b)=1 使得和最大. [思路] 二分图的最大权独立集(可以这么叫么QAQ 先拆点,对于不满足条件的两个 ...
- BZOJ 3158 千钧一发 最小割
分析: 偶数对满足条件2,所有奇数对满足条件1. 如果你能一眼看出这个规律,这道题就完成了一半. 我们只需要将数分为两类,a值为奇数,就从S向这个点连容量为b值的边,a值为偶数,就从这个点向T连容量为 ...
- BZOJ 3275: Number (二分图最小割)
题意 有nnn个数,其中同时满足下面两个条件的数对不能同时选,求选出一些数让和最大. 若两个数aaa,bbb同时满足以下条件,则aaa,bbb不能同时被选 存在正整数ccc,使a∗a+b∗b=c∗ca ...
- [BZOJ 3144] [Hnoi2013] 切糕 【最小割】
题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...
- [BZOJ 3894] 文理分科 【最小割】
题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...
- BZOJ 2039 人员雇佣 二元关系 最小割
题面太长了,请各位自行品尝—>人员雇佣 分析: 借用题解的描述: a.选择每个人有一个代价Ai b.如果有两个人同时选择就可以获得收益Ei,j c.如果一个人选择另一个不选会产生代价Ei,j 这 ...
- BZOJ 2007 海拔(平面图最小割-最短路)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2007 题意:给出一个n*n的格子,那么顶点显然有(n+1)*(n+1)个.每两个相邻顶点 ...
- BZOJ 2768 冠军调查(最小割)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2768 题意:给出一个无向图,每个点有一个值0或者1.现在重新设置每个点的值0或者1.设重 ...
随机推荐
- wechat开发
1.easywechat安装 2.weichat打通服务器 function getTest(Request $request){ $token = 'zhenhaokeji'; $data = $r ...
- AAL模版 中英文对照
来源:http://52brain.com/thread-17336-1-1.html Brodmann分区是一个根据细胞结构将大脑皮层划分为一系列解剖区域的系统.神经解剖学中所谓细胞结构(Cytoa ...
- 背包dp整理
01背包 动态规划是一种高效的算法.在数学和计算机科学中,是一种将复杂问题的分成多个简单的小问题思想 ---- 分而治之.因此我们使用动态规划的时候,原问题必须是重叠的子问题.运用动态规划设计的算法比 ...
- poj3270
Cow Sorting Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6750 Accepted: 2633 Descr ...
- hessian学习
hessian是一个采用二进制格式传输的服务框架,相对传统soap web service,更轻量,更快速.官网地址:http://hessian.caucho.com/ 目前已经支持N多语言,包括: ...
- Python3.1-标准库之Numpy
这系列用来介绍Python的标准库的支持Numpy部分.资料来自http://wiki.scipy.org/Tentative_NumPy_Tutorial,页面有许多链接,这里是直接翻译,所以会无法 ...
- Theano2.1.3-基础知识之更多的例子
来自:http://deeplearning.net/software/theano/tutorial/examples.html More Examples 现在,是时候开始系统的熟悉theano的 ...
- JS运动从入门到兴奋1
hello,我是沐晴,一个充满了才华,却靠了照骗走江湖的前端妹子.在这个充满PS的年代,这你们都信,哈哈,废话不多说,今天要分享的是关注JS运动的知识.楼主一直认为,不管学习什么,核心思想才是王道,掌 ...
- SQLServer中的事务与锁
事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁:是数据库性能的 ...
- 自定义getElementByClass
DOM已经实现了getElementByClass,这个功能内部是怎么实现的呢 js代码及如何使用: function getElementByClass(className,parentNode){ ...