题目大意:

给定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. CAD隐藏或显示工具条上的按钮(com接口VB语言)

    主要用到函数说明: MxDrawXCustomFunction::Mx_HideToolBarControl 隐藏或显示工具条上的按钮.详细说明如下: 参数 说明 IN LPCTSTR pszTool ...

  2. docker常用命令理解

    docker help Commands: attach Attach local standard input, output, and error streams to a running con ...

  3. python安装外部模块Django

    Windows安装Django模块: 由于本人安装的Python版本是Python3.7,所以安装命令为:pip3 install django /pip3 install django安装过程中出现 ...

  4. 洛谷——P2659 美丽的序列

    P2659 美丽的序列 单调栈维护区间最小值,单调递增栈维护区间最小值, 考虑当前数对答案的贡献,不断加入数,如果加入的数$>$栈顶,说明栈顶的元素对当前数所在区间是有贡献的,同时加入当前的数. ...

  5. 洛谷 4302 BZOJ 1090 SCOI2003 字符串折叠 UVA1630 Folding(输出方案版)

    [题解] 区间DP.  设f[i][j]表示i~j的最小代价.再枚举中间点k,很容易想到转移方程为f[i][j]=min(f[i][j],f[i][k]+f[k][j]),同时如果i~k可以通过重复获 ...

  6. 解决Web部署 woff字体 404错误

    问题:刚刚在IIS上部署web项目的时候,发现浏览器总是报找不到woff字体的错误.导致浏览器加载字体报404错误. 原因:因为服务器IIS不认WOFF这个文件类型,只要在IIS上添加MIME 类型即 ...

  7. Python学习笔记 (2.1)标准数据类型之Number(数字)

    Python3中,数字分为四种——int,float,bool,complex int(整型) 和数学上的整数表示没啥区别,没有大小限制(多棒啊,不用写整数高精了),可正可负.还可表示16进制,以 0 ...

  8. ZOJ 1654 Place the Robots

    题目大意: 在空地上放置尽可能多机器人,机器人朝上下左右4个方向发射子弹,子弹能穿过草地,但不能穿过墙, 两个机器人之间的子弹要保证互不干扰,求所能放置的机器人的最大个数 每个机器人所在的位置确定了, ...

  9. hdu3461

    题意描述:有一个类似滚轮式的密码锁放在一排共n个,有m种操作每次操作一个区间,且此次操作后的所有密码相同,问最多能形成多少种密码 解决:将区间分为可变部分和不可变部分,没当有可变部分时候总区间数要减去 ...

  10. java操作数据库的工具库(from韩顺平)

    需要引入jar包sqljdbc4.jar 其他关系型数据库只需要改动前面的连接过程,其他的一样 package com.cx.util; import java.io.FileInputStream; ...