#include<stdio.h> #include<string.h> #include <iostream> #include <algorithm> #include <utility> using namespace std; #define INF 1000000000 pair<int, int> a[30]; /* int mindate(int q,int w){ if(q<w) return q; else return w; }*/ int main(){ int n,c; int use[30]; scanf("%d%d",&n,&c); int i,j,k; int ans,mi; for(i=0;i<n;i++){ scanf("%d%d",&a[i].first,&a[i].second); } sort(a,a+n); ans=0; for(i=n-1;i>=0;i--){ if(a[i].first>=c){ ans+=a[i].second; a[i].second=0; } } while(true){ int money=c; int yes=0; memset(use,0,sizeof(use)); for(j=n-1;j>=0;j--){ if(a[j].second>0){ int date=min(a[j].second,money/a[j].first); use[j]=date; money-=(date*a[j].first); if(money<=0){ yes=1; break; } } } if(money > 0) { for(int i = 0; i < n; i++) if(a[i].second > use[i]) { while(use[i] < a[i].second) { money -= a[i].first; use[i]++; if(money <= 0) { yes = 1; break; } } if(money <= 0) break; } } if(!yes) break; int mi = INF; for(int i = n - 1; i >= 0; i--) if(use[i]) mi = min(mi, a[i].second / use[i]); ans += mi; for(int i = n - 1; i >= 0; i--) if(use[i]) a[i].second-= mi * use[i]; } printf("%d\n",ans); return 0; }
poj 3040 这种贪心水题 居然花了我这么久 。。。
最新推荐文章于 2021-04-30 04:51:33 发布