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. 基于C#的PISDK研究(理论)

    本篇文章主要对PISDK体系结构以及重点类进行阐述. 当我们决定使用PISDK时,可能会使用到下面的类库: 在上表中,PISDK.dll为核心类,大部分主要功能都在该类中.PISDKCommon.dl ...

  2. WCF身份验证三:自定义身份验证之<MessageHeader>

    关于使用SoadHeader验证Robin已经有一篇十分精彩的文章: WCF进阶:为每个操作附加身份信息, 不过我的思维方式总是跟别人有点不太一样, 还是把类似的内容用我的方式重新组织一下. 使用He ...

  3. SSH整合主要XML代码

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...

  4. 【bzoj2326】[HNOI2011]数学作业 矩阵乘法

    题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡 ...

  5. BZOJ2729 [HNOI2012]排队 【高精 + 组合数学】

    题目链接 BZOJ2729 题解 高考数学题... 我们先把老师看做男生,女生插空站 如果两个老师相邻,我们把他们看做一个男生,女生插空站 对于\(n\)个男生\(m\)个女生的方案数: \[n!m! ...

  6. number 解题报告

    number 题目描述 给定整数 \(m,k\),求出正整数 \(n\) 使得 \(n+1,n+2,-,2n\) 中恰好有 \(m\) 个数在二进制下恰好有 \(k\) 个 \(1\). 有多组数据. ...

  7. C&C++——库头文件及其作用

    1. 一些头文件的作用::ANSI C.提供断言,assert(表达式):GCC.GTK,GNOME的基础库,提供很多有用的函数,如有数据结构操作函数.使用glib只需要包含:GCC.文件夹操作函数. ...

  8. 一些奇怪的JavaScript试题

    JavaScript有很多地方和我们熟知的C.Java等的编程习惯不同,这些不同会产生很多让人意想不到的事情.前段时间在知乎有人发了写Javascrtip试题,觉得挺好玩的,这里跟大家分享一下. 01 ...

  9. async的用法

    package com.example.administrator.myapplication; import android.os.AsyncTask; import android.util.Lo ...

  10. delegate, event - 里面涉及的参数类型必须完全一致,子类是不行的

    public void TestF() { Test += Fun; } public void Fun(Person p) { }  // 如 Person变成 SubPerson,则报错..pub ...