90分#10#11求调
查看原帖
90分#10#11求调
1084044
Super_Gluten楼主2025/2/7 11:47
#include<iostream>
#include<algorithm>
using namespace std;

struct peo{
    int left;
    int right;
    long long x;
};

bool cmp(const peo&a, const peo&b){ // 结构体排序函数
    return a.x<b.x;
}

peo p[1001];
int n=1;
long long a[4005]={};

void cal(){
    a[0]=1;
    int len=1;
    int b=p[n].right;

    for(int i=0;i<n;i++){ // 高精度乘法
        for(int j=0;j<len;j++){
            a[j]*=p[i].left;
        }
        for(int j=0;j<len;j++){
            if(a[j]>=10){
                a[j+1]+=a[j]/10;
                a[j]%=10;
                if(j==len-1) len++;
            }
        }
    }

    if(len<=1){ // 这里除了特判以外还有什么别的方法吗?
        if(len==0) printf("0");
        else {
            for(int i=1;i<n;i++){
                if(p[i].right<=a[0]) printf("%d", a[0]/p[i].right);
                break; 
            }
        }
        return;
    }

    bool pd=false;
    for(int i=len-1;i>=0;i--){ // 高精度除法
        if(a[i]<b){
            if(!pd) len--;
            if(i>0) a[i-1]+=a[i]*10;
            a[i]=0;
        }
        else{
            pd=true;
            if(i>0) a[i-1]+=(a[i]%b)*10;
            a[i]/=b;
        }
    }

    for(int i=0;i<len;i++){ // 检查进位
        if(a[i]>=10){
            a[i+1]+=a[i]/10;
            a[i]%=10;
            if(i==len-1) len++;
        }
    }
    
    for(int i=len-1;i>=0;i--) printf("%d", a[i]); // 逆序输出
    
    return ;
}

int main(){
    cin>>n;
    for(int i=0;i<=n;i++){
        scanf("%d %d", &p[i].left, &p[i].right);
        p[i].x=p[i].left*p[i].right;
    }
    sort(p+1, p+n+1, cmp);
    cal();
    return 0;
}

#10 #11 的那个结尾数据不知道怎么处理,只好特判通过,求助。回复一定关注orz

2025/2/7 11:47
加载中...