求调
  • 板块学术版
  • 楼主Moss345512
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/7/31 15:59
  • 上次更新2025/7/31 20:03:09
查看原帖
求调
1251715
Moss345512楼主2025/7/31 15:59

原题:P1080 国王游戏
90pts RE Record

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
struct P{
    int a,b;
}p[1025];
bool cmp(P a,P b){
    return a.a*a.b<=b.a*b.b;
}
struct N{
    int k,num[100025];
}tmp,ans;
N operator * (N a,int b){
    N x;
    memset(x.num,0,sizeof(x.num));
    for(int i=1;i<=a.k;i++)x.num[i]=a.num[i]*b;
    for(int i=1;i<=min(a.k+12,100000);i++){
        x.num[i+1]+=x.num[i]/10;
        x.num[i]%=10;
        if(x.num[i])x.k=i;
    }
    return x;
}
N operator / (N a,int b){
    N x;
    x.k=1;
    memset(x.num,0,sizeof(x.num));
    for(int i=1;i<=a.k;i++)x.num[i]=a.num[i];
    for(int i=a.k;i>=1;i--){
        x.num[i-1]+=x.num[i]%b*10;
        x.num[i]/=b;
    }
    for(int i=1;i<=a.k;i++)if(x.num[i])x.k=i;
    x.num[0]=0;
    return x;
}
bool operator < (N a,N b){
    if(a.k==b.k){
        for(int i=a.k;i>=1;i--)if(a.num[i]!=b.num[i])return a.num[i]<b.num[i];
        return false;
    }
    return a.k<b.k;
}
int main(){
    ans.k=tmp.k=1;
    tmp.num[1]=1;
    scanf("%d",&n);
    for(int i=0;i<=n;i++)scanf("%d %d",&p[i].a,&p[i].b);
    sort(p+1,p+n+1,cmp);
    for(int i=1;i<=n;i++){
        tmp=tmp*p[i-1].a;
        if(p[i].b==1)ans=max(ans,tmp);
        else ans=max(ans,tmp/p[i].b);
        //for(int j=tmp.k;j>=1;j--)printf("%d",tmp.num[j]);
        //printf("\n");
    }
    for(int i=ans.k;i>=1;i--)printf("%d",ans.num[i]);
    return 0;
}
2025/7/31 15:59
加载中...