AC日记——Card Game codeforces 808f
思路:
题意:
有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的更多相关文章
- AC日记——Cards Sorting codeforces 830B
Cards Sorting 思路: 线段树: 代码: #include <cstdio> #include <cstring> #include <iostream> ...
- AC日记——Success Rate codeforces 807c
Success Rate 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> ...
- AC日记——T-Shirt Hunt codeforces 807b
T-Shirt Hunt 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> ...
- AC日记——Magazine Ad codeforces 803d
803D - Magazine Ad 思路: 二分答案+贪心: 代码: #include <cstdio> #include <cstring> #include <io ...
- AC日记——Broken BST codeforces 797d
D - Broken BST 思路: 二叉搜索树: 它时间很优是因为每次都能把区间缩减为原来的一半: 所以,我们每次都缩减权值区间. 然后判断dis[now]是否在区间中: 代码: #include ...
- AC日记——Array Queries codeforces 797e
797E - Array Queries 思路: 分段处理: 当k小于根号n时记忆化搜索: 否则暴力: 来,上代码: #include <cmath> #include <cstdi ...
- AC日记——Maximal GCD codeforces 803c
803C - Maximal GCD 思路: 最大的公约数是n的因数: 然后看范围k<=10^10; 单是答案都会超时: 但是,仔细读题会发现,n必须不小于k*(k+1)/2: 所以,当k不小于 ...
- AC日记——Vicious Keyboard codeforces 801a
801A - Vicious Keyboard 思路: 水题: 来,上代码: #include <cstdio> #include <cstring> #include < ...
- AC日记——Valued Keys codeforces 801B
801B - Valued Keys 思路: 水题... 来,上代码: #include <cstdio> #include <cstring> #include <io ...
随机推荐
- SSH答疑解惑系列(二)——java.lang.reflect.InvocationTargetException异常
在项目中遇到了invocationTargetException的问题,在这里跟大家分享一下. 报错信息如下: 使用反射时,比如执行invoke方法,如果被反射执行的方法体抛出了Exception,这 ...
- servletContext的定义
- 【算法】分块——教主的魔法&不勤劳的图书管理员
由不勤劳的图书管理员带入了分块的坑,深深地被其暴力与优雅所征服.分块的实质就是将暴力块状封装起来,一整块的部分就一整块处理,零碎的部分就怎么暴力怎么来.因为分块大小的原因,限制了零碎部分数据的数量级, ...
- 【NOIP2017 D1 T1 小凯的疑惑】
题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中,最贵的 ...
- Vim使用小记(一)常用操作
By francis_hao Sep 22,2016 vim的功能自然不止如此,这里只是把日常使用频率较高的记录下来,若想了解vim的全部功能可查阅其帮助手册:help,或者查询指定命令的用法: ...
- 简单瞎搞题(bitset的操作)
链接:https://www.nowcoder.com/acm/contest/132/C来源:牛客网 题目 一共有 n个数,第 i 个数是 xi xi 可以取 [li , ri] 中任意的一个值. ...
- DIV的变高与变宽
代码: <!DOCTYPE HTML><html><head> <meta charset="utf-8"> <title&g ...
- lesson 1
1.当前只是开始接触,安装并开始熟悉Visual Studio 的操作界面及基本设置 2.学习了新建项目,简单的hello world,及对颜色的更改.
- c# vs2008报表
1. 做报表没做几次,第一次做的都忘记了,还好今天做一下就把报表弄成功了.报表中“参数字段”是可以变的,就是说需要自己赋值或者是要计算的.而在苏据库字段里面的是固定的值.不需要计算(注:有的字段查询出 ...
- 使用vs2010编辑Unity脚本,配置方法
在Unity界面上.选择Edit->Preferences->External Tools,External Script Editor一项即为编译器. 以Unity3D 4.3.4 f1 ...