题目大意:

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

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

思路:

开始想的是费用流

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

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

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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<vector>
  9. #include<map>
  10. #define ll long long
  11. #define inf 2139062143
  12. #define MAXN 500
  13. using namespace std;
  14. inline int read()
  15. {
  16. int x=,f=;char ch=getchar();
  17. while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
  18. while(isdigit(ch)) x=x*+ch-'',ch=getchar();
  19. return x*f;
  20. }
  21. int n,m,s,t,a[MAXN];
  22. ll ans;
  23. struct ZKW
  24. {
  25. int fst[MAXN],to[MAXN*MAXN],nxt[MAXN*MAXN],val[MAXN*MAXN],cos[MAXN*MAXN],cnt;
  26. int dis[MAXN],vis[MAXN],q[MAXN];
  27. void mem() {ans=,cnt=;memset(fst,0xff,sizeof(fst));}
  28. 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;}
  29. int spfa()
  30. {
  31. memset(vis,,sizeof(vis));
  32. memset(dis,,sizeof(dis));
  33. int l=,r=;
  34. q[++r]=t,dis[t]=,vis[t]=;
  35. while(l<=r)
  36. {
  37. int x=q[l++];
  38. for(int i=fst[x];i!=-;i=nxt[i])
  39. {
  40. if(val[i^] && dis[to[i]]>dis[x]-cos[i])
  41. {
  42. dis[to[i]]=dis[x]-cos[i];
  43. if(!vis[to[i]]) q[++r]=to[i],vis[to[i]]=;
  44. }
  45. }
  46. vis[x]=;
  47. }
  48. return dis[s]<inf;
  49. }
  50. int dfs(int x,int a)
  51. {
  52. if(x==t){vis[t]=;return a;}
  53. int res=,f;vis[x]=;
  54. for(int i=fst[x];i!=-;i=nxt[i])
  55. if(!vis[to[i]]&&val[i]&&dis[x]-cos[i]==dis[to[i]])
  56. {
  57. f=dfs(to[i],min(val[i],a-res));
  58. if(f)ans+=f*cos[i],val[i]-=f,val[i^]+=f,res+=f;
  59. if(res==a)break;
  60. }
  61. return res;
  62. }
  63. void solve()
  64. {
  65. int f=;
  66. while(spfa())
  67. {
  68. vis[t]=;
  69. while(vis[t])
  70. {
  71. memset(vis,,sizeof(vis));
  72. f+=dfs(s,);
  73. }
  74. }
  75. printf("%d %lld\n",f,-ans);
  76. }
  77. }Z;
  78. int main()
  79. {
  80. int g,h;
  81. while(cin>>n>>m)
  82. {
  83. if(!n&&!m) return ;
  84. Z.mem();
  85. s=,t=n+m+;
  86. for(int i=;i<=n;i++) {a[i]=read();Z.add(s,i,,-a[i]);Z.add(i,s,,a[i]);}
  87. for(int j=;j<=m;j++)
  88. {
  89. g=read(),h=read();
  90. for(int i=;i<=n;i++)
  91. if(h>=a[i]) {Z.add(i,n+j,,);Z.add(n+j,i,,);}
  92. Z.add(n+j,t,g,);Z.add(t,n+j,,);
  93. }
  94. Z.solve();
  95. }
  96. }

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

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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<vector>
  9. #include<map>
  10. #define ll long long
  11. #define inf 2139062143
  12. #define MAXN 220
  13. using namespace std;
  14. inline int read()
  15. {
  16. int x=,f=;char ch=getchar();
  17. while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
  18. while(isdigit(ch)) x=x*+ch-'',ch=getchar();
  19. return x*f;
  20. }
  21. int n,m,a[MAXN];
  22. struct data
  23. {
  24. int q,c;
  25. bool operator < (const data &x)const
  26. {
  27. return q<x.q||(q==x.q&&c<x.c);
  28. }
  29. }b[MAXN];
  30. int main()
  31. {
  32. int ans,res,j;
  33. while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
  34. {
  35. ans=res=;
  36. for(int i=;i<=n;i++) a[i]=read();
  37. for(int i=;i<=m;i++) b[i].c=read(),b[i].q=read();
  38. sort(a+,a+n+);
  39. sort(b+,b+m+);
  40. j=m;
  41. for(int i=n;i&&j;i--)
  42. {
  43. while(!b[j].c) j--;
  44. if(b[j].q>=a[i]) b[j].c--,ans++,res+=a[i];
  45. }
  46. printf("%d %d\n",ans,res);
  47. }
  48. }

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. Linux常用命令——目录处理命令

    1.建立目录:mkdir mkdir -p [目录名] -p 递归创建 命令英文原意:make directories 实例: [root@localhost ~]# ls anaconda-ks.c ...

  2. linux下C/C++程序的内存布局

    内核空间和用户空间: 我们在编写程序时使用的内存空间叫虚拟内存,程序在运行时,要完成虚拟内存到物理内存的转换.假如在32位环境上,理论上我们可以使用的虚拟内存空间是4GB,但实际上这4GB并不能完全给 ...

  3. Python学习-算术运算符,赋值运算符和复合运算符

    算术运算符 常见的算术运算符有 : +     加法运算符 print(1 + 2); // 3 print('1' + '2'); //12 不仅可以进行2个数字的相加,还可以连接2个字符串 -   ...

  4. python_ 学习笔记(基本数据类型)

    python3有6中标准数据类型:Number(数字).String(字符串).List(列表).Tuple(元组).Dictionary(字典).Set(集合)不可变数据:Number.String ...

  5. python爬虫28 | 你爬下的数据不分析一波可就亏了啊,使用python进行数据可视化

    通过这段时间 小帅b教你从抓包开始 到数据爬取 到数据解析 再到数据存储 相信你已经能抓取大部分你想爬取的网站数据了 恭喜恭喜 但是 数据抓取下来 要好好分析一波 最好的方式就是把数据进行可视化 这样 ...

  6. python之cookbook-day02

    第一章:数据结构和算法 1.2 解压可迭代对象赋值给多个变量 问题: 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可迭代对象中解压出 N 个元素 ...

  7. ndk编译libpcap 1.7.4(最终解决方法)

    具体方法和测试见上一篇. 后来才知道,LIBPCAP本来就写了几套获取网卡的函数,这样就简单了.和上篇一样,把那5个文件从LINUX下托下来. 上篇忘了说了,还要将LINUX中/usr/include ...

  8. 洛谷 2966 2966 [USACO09DEC]牛收费路径Cow Toll Paths

    [题意概述] 给出一个图,点有正点权,边有正边权,通过两点的代价为两点间的最短路加上路径通过的点的点权最大值. 有M个询问,每次询问通过两点的代价. [题解] 先把点按照点权从小到大排序,然后按照这个 ...

  9. Python基础(十一) 异常处理

    在程序运行过程中,总会遇到各种各样的错误,有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这样的错误我们通常称之为BUG,BUG是必须修复的.在Python中内置了一套异常处理机 ...

  10. JS权威指南笔记1

    1.JavaScript数据类型可分为两种:原始类型和对象类型.原始类型下又包括数字.字符串和布尔值,以及null和undefined这两个特殊的:对象是属性的集合,且每个属性都有自己的"名 ...