bzoj 2465 小球
题目大意:
给定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 小球的更多相关文章
- BZOJ 2465: [中山市选2009]小球
难度在于读题 #include<cstdio> #include<algorithm> using namespace std; int a[1000005]; struct ...
- 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] ...
- bzoj 2037: [Sdoi2008]Sue的小球
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struc ...
- bzoj 2037: [Sdoi2008]Sue的小球——dp
Description Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当一个海盗,而是要收集空中漂浮的彩 ...
- bzoj 1867: [Noi1999]钉子和小球【dp】
设f[i][j]为掉到f[i][j]时的概率然后分情况随便转移一下就好 主要是要手写分数比较麻烦 #include<iostream> #include<cstdio> usi ...
- BZOJ 1867 [Noi1999]钉子和小球 DP
想状态和钉子的位置如何匹配想了半天...后来发现不是一样的吗$qwq$ 思路:当然是$DP$啦 提交:>5次(以为无故$RE$,实则是先乘后除爆了$long\space long$) 题解: 若 ...
- [PA2014] [BZOJ 3709]~[BZOJ 3719] 合集
今天起尝试做套题喵~ (当然是因为被最大流的题目弄得恶心死了) 一共是 10 道题一道一道做 预计 3~4 内做完 尽情期待 [BZOJ 3709]Bohater 一眼就能感受到贪心的气息 因为很直观 ...
- 【BZOJ2037】Sue的小球(动态规划)
[BZOJ2037]Sue的小球(动态规划) 题面 BZOJ 题解 莫名想到这道题目 很明显是一样的 设\(f[i][j][0/1]\)表示已经接到了\(i-j\)这一段的小球 当前在\(i\)或者在 ...
- ●BZOJ 1272 [BeiJingWc2008]Gate Of Babylon
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1272 题解: 容斥,Lucas定理本题的容斥考虑类似 [BZOJ 1042 [HAOI200 ...
随机推荐
- Linux常用命令——目录处理命令
1.建立目录:mkdir mkdir -p [目录名] -p 递归创建 命令英文原意:make directories 实例: [root@localhost ~]# ls anaconda-ks.c ...
- linux下C/C++程序的内存布局
内核空间和用户空间: 我们在编写程序时使用的内存空间叫虚拟内存,程序在运行时,要完成虚拟内存到物理内存的转换.假如在32位环境上,理论上我们可以使用的虚拟内存空间是4GB,但实际上这4GB并不能完全给 ...
- Python学习-算术运算符,赋值运算符和复合运算符
算术运算符 常见的算术运算符有 : + 加法运算符 print(1 + 2); // 3 print('1' + '2'); //12 不仅可以进行2个数字的相加,还可以连接2个字符串 - ...
- python_ 学习笔记(基本数据类型)
python3有6中标准数据类型:Number(数字).String(字符串).List(列表).Tuple(元组).Dictionary(字典).Set(集合)不可变数据:Number.String ...
- python爬虫28 | 你爬下的数据不分析一波可就亏了啊,使用python进行数据可视化
通过这段时间 小帅b教你从抓包开始 到数据爬取 到数据解析 再到数据存储 相信你已经能抓取大部分你想爬取的网站数据了 恭喜恭喜 但是 数据抓取下来 要好好分析一波 最好的方式就是把数据进行可视化 这样 ...
- python之cookbook-day02
第一章:数据结构和算法 1.2 解压可迭代对象赋值给多个变量 问题: 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可迭代对象中解压出 N 个元素 ...
- ndk编译libpcap 1.7.4(最终解决方法)
具体方法和测试见上一篇. 后来才知道,LIBPCAP本来就写了几套获取网卡的函数,这样就简单了.和上篇一样,把那5个文件从LINUX下托下来. 上篇忘了说了,还要将LINUX中/usr/include ...
- 洛谷 2966 2966 [USACO09DEC]牛收费路径Cow Toll Paths
[题意概述] 给出一个图,点有正点权,边有正边权,通过两点的代价为两点间的最短路加上路径通过的点的点权最大值. 有M个询问,每次询问通过两点的代价. [题解] 先把点按照点权从小到大排序,然后按照这个 ...
- Python基础(十一) 异常处理
在程序运行过程中,总会遇到各种各样的错误,有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这样的错误我们通常称之为BUG,BUG是必须修复的.在Python中内置了一套异常处理机 ...
- JS权威指南笔记1
1.JavaScript数据类型可分为两种:原始类型和对象类型.原始类型下又包括数字.字符串和布尔值,以及null和undefined这两个特殊的:对象是属性的集合,且每个属性都有自己的"名 ...