这题主要是贪心和高精度
具体请看程序
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct hehe{ int a,b; }h[1010]; struct bigint{ int len; int l[1010]; }ans,now; bool cmp(hehe a,hehe b){ return a.a*a.b<b.a*b.b; } inline bigint operator *(const bigint a,int b){ bigint c;int len=a.len; memset(c.l,0,sizeof(c.l)); for(int i=0;i<len;i++){ c.l[i]+=a.l[i]*b; c.l[i+1]+=c.l[i]/10000; c.l[i]%=10000; } while(c.l[len]>0){ c.l[len+1]=c.l[len]/10000; c.l[len]%=10000;len++; } while(len>1&&c.l[len-1]==0)len--; c.len=len; return c; } inline bigint operator /(const bigint a,int b){ bigint c;int len=a.len; memset(c.l,0,sizeof(c.l)); for(int i=len-1;i>0;i--){ c.l[i-1]+=(c.l[i]+a.l[i])%b*10000; c.l[i]=(c.l[i]+a.l[i])/b; } c.l[0]=(c.l[0]+a.l[0])/b; while(len>1&&c.l[len-1]==0)len--; c.len=len; return c; } inline bool operator >(const bigint a,const bigint b){ if(a.len>b.len)return true; if(a.len<b.len)return false; for(int i=a.len-1;i>=0;i--){ if(a.l[i]>b.l[i])return true; if(a.l[i]<b.l[i])return false; } return true; } int main() { int n,a,b; ans.len=1;ans.l[0]=0; now.len=1;now.l[0]=1; cin>>n; for(int i=0;i<=n;i++)cin>>h[i].a>>h[i].b; sort(h+1,h+n+1,cmp); for(int i=0;i<=n;i++){ if(i!=0&&(now/h[i].b)>ans)ans=now/h[i].b; now=now*h[i].a; } cout<<ans.l[ans.len-1]; for(int i=ans.len-2;i>=0;i--)printf("%04d",ans.l[i]); return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。