贪心:一直超时,查了后发现要标记.
不过sun和v不写>0会出错?
http://poj.org/problem?id=3040
1 #include<iostream> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define N 15000 7 #define ll long long 8 #define inf 0x3f3f3f3f 9 #define mem(a) memset(a,0,sizeof(a)) 10 struct node{ 11 int x,y; 12 }f[25],g; 13 int main() 14 { 15 int n; 16 int c,ans=0; 17 cin>>n>>c; 18 int t=n; 19 for(int i=1;i<=t;i++) 20 { 21 cin>>f[i].x>>f[i].y; 22 if(f[i].x>=c) {ans+=f[i].y;i--;t--;} 23 } 24 for(int i=1;i<t;i++) 25 { 26 for(int j=i+1;j<=t;j++) 27 { 28 if(f[i].x<f[j].x) 29 { 30 g=f[i]; 31 f[i]=f[j]; 32 f[j]=g; 33 } 34 } 35 } 36 int mark[25]; 37 while(1) 38 { 39 mem(mark); 40 int sum=c; 41 for(int i=1;i<=t;i++) 42 { 43 if(f[i].y&&sum>0) 44 { 45 mark[i]+=min(f[i].y,sum/f[i].x); 46 sum-=f[i].x*mark[i]; 47 } 48 } 49 if(sum>0) 50 { 51 int v; 52 for(int i=t;i>=1;i--) 53 { 54 if(f[i].y&&sum>0) 55 { 56 v=min(f[i].y-mark[i],(sum+f[i].x-1)/f[i].x);// hou 57 if(v>0){ 58 sum-=v*f[i].x; 59 mark[i]+=v; 60 } 61 } 62 } 63 } 64 if(sum>0)break; 65 int v=inf; 66 for(int i=1;i<=t;i++) 67 { 68 if(mark[i]) 69 { 70 v=min(v,f[i].y/mark[i]); 71 } 72 } 73 ans+=v; 74 for(int i=1;i<=t;i++) 75 { 76 if(mark[i]) 77 { 78 f[i].y-=v*mark[i]; 79 } 80 } 81 } 82 cout<<ans<<endl; 83 return 0; 84 }