F - Card Game

思路:

  题意:

    有n张卡片,每张卡片三个值,pi,ci,li;

    要求选出几张卡片使得pi之和大于等于给定值;

    同时,任意两两ci之和不得为素数;

    求选出的li的最小值,如果不能到达给定值则输出-1;

    二分+网络流最小割;

代码:

#include <bits/stdc++.h>

namespace data
{
#define maxn 105
#define maxque 200005 int val[maxn],mag[maxn],lev[maxn],num,lit; #undef maxn
#undef maxque
} namespace init
{
inline void in(int &justval)
{
int if_z=; justval=;
char Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
justval=justval*+Cget-'';
Cget=getchar();
}
justval*=if_z;
}
} namespace solve
{
#define maxn 105
#define maxque 200005
#define INF 0x7fffffff struct EdgeType
{
int v,f; EdgeType *next,*another; };
struct EdgeType *head[maxn],e[maxque]; int que[maxque],sum,prime[maxque*],num,cnt,s,t,deep[maxn]; bool p_[maxque*-]; inline void edge_add(int u,int v,int f)
{
e[++cnt].v=v,e[cnt].f=f,e[cnt].next=head[u],head[u]=&e[cnt];
e[++cnt].v=u,e[cnt].f=,e[cnt].next=head[v],head[v]=&e[cnt];
e[cnt].another=&e[cnt-],e[cnt-].another=&e[cnt];
} int min(const int &tops_,const int &tops__)
{
if(tops_<tops__) return tops_;
else return tops__;
} inline bool bfs()
{
t=data::num+,s=;int h=,tail=;que[h]=s;
for(int i=s;i<=t;i++) deep[i]=-;deep[s]=;
while(h<tail)
{
int now=que[h++];
for(EdgeType *i=head[now];i!=NULL;i=i->next)
{
if(deep[i->v]<&&i->f)
{
deep[i->v]=deep[now]+;
if(i->v==t) return true;
que[tail++]=i->v;
}
}
}
return false;
} int flowing(int now,int flow)
{
if(now==t||flow<=) return flow;
int oldflow=;
for(EdgeType *i=head[now];i!=NULL;i=i->next)
{
if(deep[i->v]==deep[now]+&&i->f)
{
int pos=flowing(i->v,min(i->f,flow));
flow-=pos,oldflow+=pos,i->f-=pos,i->another->f+=pos;
if(!flow) return oldflow;
}
}
if(!oldflow) deep[now]=-;
return oldflow;
} bool dinic(int res,int lit)
{
while(bfs()) res-=flowing(s,INF);
return res>=lit;
} void ouler(int limit)
{
for(int i=;i<=limit;i++)
{
if(!p_[i]) prime[++num]=i;
for(int j=;prime[j]*i<=limit&&j<=num;j++)
{
p_[i*prime[j]]=true;
if(i%prime[j]==) break;
}
}
} bool check(int x)
{
int n=data::num,k=data::lit,res=;s=,t=n+,cnt=;
for(int i=s;i<=t;i++) head[i]=NULL;
int idx__=-;
for(int i=;i<=n;i++)
{
if(data::lev[i]>x) continue;
if(data::mag[i]==&&data::val[i]>data::val[idx__]) idx__=i;
}
for(int i=;i<=n;i++)
{
if(data::lev[i]>x||(data::mag[i]==&&idx__!=i)) continue;
res+=data::val[i];
if(data::mag[i]&)
{
edge_add(s,i,data::val[i]);
for(int j=;j<=n;j++)
{
if(data::lev[j]>x||i==j) continue;
if(!(data::mag[j]&))
{
if(!p_[data::mag[i]+data::mag[j]]) edge_add(i,j,INF);
}
else if(data::mag[i]+data::mag[j]==) edge_add(i,j,INF);
}
}
else edge_add(i,t,data::val[i]);
}
return dinic(res,k);
} void binary()
{
ouler(maxque*-);
int l=,r=data::num,ans=-;
while(l<=r)
{
int mid=l+r>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
printf("%d\n",ans);
} #undef INF
#undef maxn
#undef maxque
} int main()
{
init::in(data::num),init::in(data::lit);
for(int i=;i<=data::num;i++)
{
init::in(data::val[i]);
init::in(data::mag[i]);
init::in(data::lev[i]);
}
solve::binary();
return ;
}

AC日记——Card Game codeforces 808f的更多相关文章

  1. AC日记——Cards Sorting codeforces 830B

    Cards Sorting 思路: 线段树: 代码: #include <cstdio> #include <cstring> #include <iostream> ...

  2. AC日记——Success Rate codeforces 807c

    Success Rate 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> ...

  3. AC日记——T-Shirt Hunt codeforces 807b

    T-Shirt Hunt 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> ...

  4. AC日记——Magazine Ad codeforces 803d

    803D - Magazine Ad 思路: 二分答案+贪心: 代码: #include <cstdio> #include <cstring> #include <io ...

  5. AC日记——Broken BST codeforces 797d

    D - Broken BST 思路: 二叉搜索树: 它时间很优是因为每次都能把区间缩减为原来的一半: 所以,我们每次都缩减权值区间. 然后判断dis[now]是否在区间中: 代码: #include ...

  6. AC日记——Array Queries codeforces 797e

    797E - Array Queries 思路: 分段处理: 当k小于根号n时记忆化搜索: 否则暴力: 来,上代码: #include <cmath> #include <cstdi ...

  7. AC日记——Maximal GCD codeforces 803c

    803C - Maximal GCD 思路: 最大的公约数是n的因数: 然后看范围k<=10^10; 单是答案都会超时: 但是,仔细读题会发现,n必须不小于k*(k+1)/2: 所以,当k不小于 ...

  8. AC日记——Vicious Keyboard codeforces 801a

    801A - Vicious Keyboard 思路: 水题: 来,上代码: #include <cstdio> #include <cstring> #include < ...

  9. AC日记——Valued Keys codeforces 801B

    801B - Valued Keys 思路: 水题... 来,上代码: #include <cstdio> #include <cstring> #include <io ...

随机推荐

  1. PAT 1020 月饼

    https://pintia.cn/problem-sets/994805260223102976/problems/994805301562163200 月饼是中国人在中秋佳节时吃的一种传统食品,不 ...

  2. (转)MongoDB numa系列问题三:overcommit_memory和zone_reclaim_mode

    内核参数overcommit_memory : 它是 内存分配策略 可选值:0.1.2.0:表示内核将检查是否有足够的可用内存供应用进程使用:如果有足够的可用内存,内存申请允许:否则,内存申请失败,并 ...

  3. Flink源码解读之状态管理

    一.从何说起 State要能发挥作用,就需要持久化到可靠存储中,flink中持久化的动作就是checkpointing,那么从TM中执行的Task的基类StreamTask的checkpoint逻辑说 ...

  4. [剑指Offer] 8.跳台阶

     题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. [思路]与斐波那契数列类似 class Solution { public: int jumpF ...

  5. 前端MVC

    闲来没事,画了个张图,是我理解的MVC

  6. Android中有哪些好的开发框架?

    在安卓开发中,框架的使用必不可少,合理利用一些好的开发框架,往往可以达到事半功倍的效果.本文小编就将和大家分享安卓开发者不得不知的5款框架,一起来看看吧,新技能get走起~~ 1.thinkAndro ...

  7. IntellIJ IDEA 配置 Git,顺带解决Git Push rejected问题

    1.下载便携版本git https://git-scm.com/download/win 弹出的下载取消,重新选择 2.解压自压缩文件. 3.配置IDEA 4.测试 5.配置终端环境shell为bas ...

  8. BZOJ2120 数颜色 【带修改莫队】

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 6579  Solved: 2625 [Submit][Status][Discus ...

  9. [HEOI2017]分手是祝愿 期望概率dp 差分

    经分析可知:I.操作每个灯可看做一种异或状态 II.每个状态可看做是一些异或状态的异或和,而且每个异或状态只能由它本身释放或放入 III.每一种异或状态只有存在不存在两中可行状态,因此这些灯只有同时处 ...

  10. Consumer [分组背包]

    Consumer Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others) Total Subm ...