题目大意:

给定n个不同颜色的球,每个球都有一个分数,同时有m个瓶子,每个瓶子都有固定的容量

必须把球放到瓶子里面 计算最多能放多少个球到这些瓶子里

思路:

开始想的是费用流

超级源向每个球连一条 容量为1,费用为球的分数的边

每个瓶子和它可以装下的球连一条 容量为1,费用为0的边

每个瓶子和汇点连一条 容量为瓶的容量,费用为0的边

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define inf 2139062143
#define MAXN 500
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) x=x*+ch-'',ch=getchar();
return x*f;
}
int n,m,s,t,a[MAXN];
ll ans;
struct ZKW
{
int fst[MAXN],to[MAXN*MAXN],nxt[MAXN*MAXN],val[MAXN*MAXN],cos[MAXN*MAXN],cnt;
int dis[MAXN],vis[MAXN],q[MAXN];
void mem() {ans=,cnt=;memset(fst,0xff,sizeof(fst));}
void add(int u,int v,int w,int c) {nxt[cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w,cos[cnt++]=c;}
int spfa()
{
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
int l=,r=;
q[++r]=t,dis[t]=,vis[t]=;
while(l<=r)
{
int x=q[l++];
for(int i=fst[x];i!=-;i=nxt[i])
{
if(val[i^] && dis[to[i]]>dis[x]-cos[i])
{
dis[to[i]]=dis[x]-cos[i];
if(!vis[to[i]]) q[++r]=to[i],vis[to[i]]=;
}
}
vis[x]=;
}
return dis[s]<inf;
}
int dfs(int x,int a)
{
if(x==t){vis[t]=;return a;}
int res=,f;vis[x]=;
for(int i=fst[x];i!=-;i=nxt[i])
if(!vis[to[i]]&&val[i]&&dis[x]-cos[i]==dis[to[i]])
{
f=dfs(to[i],min(val[i],a-res));
if(f)ans+=f*cos[i],val[i]-=f,val[i^]+=f,res+=f;
if(res==a)break;
}
return res;
}
void solve()
{
int f=;
while(spfa())
{
vis[t]=;
while(vis[t])
{
memset(vis,,sizeof(vis));
f+=dfs(s,);
}
}
printf("%d %lld\n",f,-ans);
}
}Z;
int main()
{
int g,h;
while(cin>>n>>m)
{
if(!n&&!m) return ;
Z.mem();
s=,t=n+m+;
for(int i=;i<=n;i++) {a[i]=read();Z.add(s,i,,-a[i]);Z.add(i,s,,a[i]);}
for(int j=;j<=m;j++)
{
g=read(),h=read();
for(int i=;i<=n;i++)
if(h>=a[i]) {Z.add(i,n+j,,);Z.add(n+j,i,,);}
Z.add(n+j,t,g,);Z.add(t,n+j,,);
}
Z.solve();
}
}

棒神写的费用流没T 还是我太弱了 %%%棒神

然后发现有个贪心就是使每个球尽可能价值最大,A了

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define inf 2139062143
#define MAXN 220
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) x=x*+ch-'',ch=getchar();
return x*f;
}
int n,m,a[MAXN];
struct data
{
int q,c;
bool operator < (const data &x)const
{
return q<x.q||(q==x.q&&c<x.c);
}
}b[MAXN];
int main()
{
int ans,res,j;
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
ans=res=;
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=m;i++) b[i].c=read(),b[i].q=read();
sort(a+,a+n+);
sort(b+,b+m+);
j=m;
for(int i=n;i&&j;i--)
{
while(!b[j].c) j--;
if(b[j].q>=a[i]) b[j].c--,ans++,res+=a[i];
}
printf("%d %d\n",ans,res);
}
}

bzoj 2465 小球的更多相关文章

  1. BZOJ 2465: [中山市选2009]小球

    难度在于读题 #include<cstdio> #include<algorithm> using namespace std; int a[1000005]; struct ...

  2. bzoj千题计划189:bzoj1867: [Noi1999]钉子和小球

    http://www.lydsy.com/JudgeOnline/problem.php?id=1867 dp[i][j] 落到(i,j)的方案数 dp[i][j]=0.5*dp[i-1][j]   ...

  3. bzoj 2037: [Sdoi2008]Sue的小球

    #include<cstdio> #include<iostream> #include<algorithm> using namespace std; struc ...

  4. bzoj 2037: [Sdoi2008]Sue的小球——dp

    Description Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩 ...

  5. bzoj 1867: [Noi1999]钉子和小球【dp】

    设f[i][j]为掉到f[i][j]时的概率然后分情况随便转移一下就好 主要是要手写分数比较麻烦 #include<iostream> #include<cstdio> usi ...

  6. BZOJ 1867 [Noi1999]钉子和小球 DP

    想状态和钉子的位置如何匹配想了半天...后来发现不是一样的吗$qwq$ 思路:当然是$DP$啦 提交:>5次(以为无故$RE$,实则是先乘后除爆了$long\space long$) 题解: 若 ...

  7. [PA2014] [BZOJ 3709]~[BZOJ 3719] 合集

    今天起尝试做套题喵~ (当然是因为被最大流的题目弄得恶心死了) 一共是 10 道题一道一道做 预计 3~4 内做完 尽情期待 [BZOJ 3709]Bohater 一眼就能感受到贪心的气息 因为很直观 ...

  8. 【BZOJ2037】Sue的小球(动态规划)

    [BZOJ2037]Sue的小球(动态规划) 题面 BZOJ 题解 莫名想到这道题目 很明显是一样的 设\(f[i][j][0/1]\)表示已经接到了\(i-j\)这一段的小球 当前在\(i\)或者在 ...

  9. ●BZOJ 1272 [BeiJingWc2008]Gate Of Babylon

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1272 题解: 容斥,Lucas定理本题的容斥考虑类似 [BZOJ 1042 [HAOI200 ...

随机推荐

  1. Vue简易博客总结

    项目结构: 首先,编写博客的导航栏组件BlogHeader.vue: <template> <nav> <ul> <li> <router-lin ...

  2. vue-quill-editor + element-ui upload实现富文本图片上传

    代码贴上 <template> <div class="quill-editor-example"> <div class="box&quo ...

  3. 对vuex的一点理解

    vuex是vue.js的一个状态管理工具,它适用于解决平行组件之间的数据共享问题.一般情况下,我们更多的是父子组件之间通过props或$emit来实现传值,如何不满足以上情况那只有使用vuex进行解决 ...

  4. Linux 安装 JDK 详解

    安装 JDK 说明:Linux 系统中安装软件需在 root 用户下进行. (1) 首先下载 jdk-8u131-linux-x64.rpm (2)将用户切换至 root,在 opt 文件夹下新建 s ...

  5. request在作用域中管理属性

    request在作用域中管理属性 制作人:全心全意 在作用域中管理属性 setAttribute(String name,Object object) name:表示变量名,为String类型,在转发 ...

  6. LINUX-光盘

    cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容 mkisofs /dev/cdrom > ...

  7. Ubuntu notes

    ubuntu notes Table of Contents 1. backup data 2. Basics Ubuntu 3. Install, uninstall packages 4. Bas ...

  8. react入门----组件的基础用法

    1.组件 <!-- React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 ...

  9. UVA 12697 Minimal Subarray Length

    Minimal Subarray Length Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA ...

  10. PHP输出缓冲控制 - Output Control 函 应用详解

    简介 说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffe ...