题目大意:
给定n个不同颜色的球,每个球都有一个分数,同时有m个瓶子,每个瓶子都有固定的容量
必须把球放到瓶子里面 计算最多能放多少个球到这些瓶子里
思路:
开始想的是费用流
超级源向每个球连一条 容量为1,费用为球的分数的边
每个瓶子和它可以装下的球连一条 容量为1,费用为0的边
每个瓶子和汇点连一条 容量为瓶的容量,费用为0的边
然后发现有个贪心就是使每个球尽可能价值最大,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=0,f=1;char ch=getchar(); 17 while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} 18 while(isdigit(ch)) x=x*10+ch-‘0‘,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=0; 36 for(int i=1;i<=n;i++) a[i]=read(); 37 for(int i=1;i<=m;i++) b[i].c=read(),b[i].q=read(); 38 sort(a+1,a+n+1); 39 sort(b+1,b+m+1); 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 }