有 n 種數字,第 i 種數字是 ai、有 bi 個,權值是 ci。
若兩個數字 ai、aj 滿足,ai 是 aj 的倍數,且 ai/aj 是乙個質數,
那麼這兩個數字可以配對,並獲得 ci×cj 的價值。
乙個數字只能參與一次配對,可以不參與配對。
在獲得的價值總和不小於 0 的前提下,求最多進行多少次配對。
n≤200,ai≤10^9,bi≤10^5,∣ci∣≤10^5
看到n很小就想到網路流了,有邊權就考慮費用流。可以先把a[i]質因數分解得到指數之和,並按照奇偶性作二分圖,能整除且指數和差為1的就連邊
然後就能二分答案看能否達到限度了,如果建圖放在外面還是跑得很快的
#include
#include
#include
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define fill(x,t) memset(x,t,sizeof(x))
typedef
long
long ll;
typedef
std:: pair pair;
const ll inf=1000000000000000ll;
const
int inf=0x3f3f3f3f;
const
int n=2005;
const
int e=500005;
struct edge e[e];
intqueue[n],head,tail;
int pre[n],rec[n],a[n],b[n];
int ls[n],edcnt=1,tot;
ll dis[n],c[n];
bool vis[n];
void addedge(int x,int y,int w,ll c) ; ls[x]=edcnt;
e[++edcnt]=(edge) ; ls[y]=edcnt;
}bool spfa(int st,int ed)
}vis[now]=0;
}return dis[ed]!=-inf;
}pair modify(int ed)
for (int i=ed;pre[i];i=e[pre[i]].x)
return pair(mn,cost*(ll)mn);
}pair mcf(int st,int ed)
return ret;
}void build_graph(int n,int lim)
}bool check(int n,int lim)
int solve(int n)
return l-1;
}int cal(int n)
if (n!=1) ret++;
return ret;
}int main(void)
addedge(0,i,b[i],0);
rep(j,1,n) if (rec[j]%2) else
if (a[j]%a[i]==0&&rec[i]+1==rec[j]) }}
addedge(n+2,0,0,0);
int prt=solve(n);
printf("%d\n",prt);
return
0;}
bzoj4514 Sdoi2016 數字配對
bzoj4514 sdoi2016 數字配對 題意 有 n 種數字,第 i 種數字是 ai 有 bi 個,權值是 ci。若兩個數字 ai aj 滿足ai 是 aj 的倍數且 ai aj 是乙個質數,那麼這兩個數字可以配對,並獲得 ci cj 的價值。乙個數字只能參與一次配對,可以不參與配對。在獲得的...
BZOJ 4514 Sdoi2016 數字配對
time limit 10 sec memory limit 128 mb submit 1606 solved 608 submit status discuss 有 n 種數字,第 i 種數字是 ai 有 bi 個,權值是 ci。若兩個數字 ai aj 滿足,ai 是 aj 的倍數,且 ai a...
BZOJ4514 Sdoi2016 數字配對
給出n種數a i 和每種數的個數b i 再給出c i 1 i n 如果a i 和a j 能配對當且僅當a i a j 0 a i a j 為質數,並且i和j配對的價值為c i c j 要求在總價值不小於0的情況下,求出最大配對數 跟機房的hanks o和rose max討論了老久才做出來 最大費用最...