这题主要是贪心和高精度

具体请看程序

#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同意,禁止转载,侵权者必究。

posted on 2017-05-14 13:28  Yzyet  阅读(253)  评论(0编辑  收藏  举报