2 条题解

  • 1
    @ 2022-8-19 17:36:05
    #include<cstdio>
    #include<algorithm>//用到sort
    #include<cstring>//用到memset
    using namespace std;
    const int MAXN=1010,MAXM=10010;//注意高精数组开到10000
    struct Node{//一个人
    	int l,r;
    }a[MAXN];
    int pro[MAXM],ans[MAXM],tmp[MAXM];//左手乘积,答案,临时数组
    int read(){//快读
    	int x=0,f=1;//记录数和符号
    	char c=getchar();//读入字符
    	while(c<'0'||c>'9'){//只要不是数
    		if(c=='-') f=-1;//是负号就记录
    		c=getchar();
    	}
    	while(c>='0'&&c<='9'){//只要是数
    		x=x*10+c-'0';//挪位再加
    		c=getchar();
    	}
    	return x*f;//返回数乘符号
    }
    bool cmp(Node aa,Node bb){//排序的比较函数
    	return aa.l*aa.r<bb.l*bb.r;//按左右手数的乘积从小到大
    }
    void copy(int *aa,int *bb){//复制
    	for(int i=0;i<MAXM;i++) aa[i]=bb[i];
    }
    bool more(int *aa,int *bb){//比较
    	for(int i=MAXM-1;i>=0;i--){
    		if(aa[i]>bb[i]) return 1;
    		if(aa[i]<bb[i]) return 0;
    	}
    	return 0;//注意这里也要写上,写0写1随便
    }
    void times(int *aa,int num){//乘法
    	for(int i=MAXM-2;i>=0;i--) aa[i]*=num;//先乘
    	for(int i=0;i<MAXM-1;i++){//再进位
    		aa[i+1]+=(aa[i]/10);//先加前一位
    		aa[i]%=10;//在处理这一位
    	}
    }
    void div(int *aa,int *bb,int num){//除法
    	memset(bb,0,sizeof(bb));//赋为0
    	int x=0;
    	for(int i=MAXM-1;i>=0;i--){//从高位到低位
        	x=x*10+aa[i];//挪位再加
    		bb[i]=x/num;//记录
    		x%=num;//模上
    	}
    }
    void print(int *aa){//输出
    	bool flag=0;//记录是否能输出
    	for(int i=MAXM-1;i>=0;i--){
    		if(!flag){//如果不能
    			if(aa[i]) flag=1;//找到第一个不是0的位,可以输出了
    			else continue;//还是不能
    		}
    		printf("%d",aa[i]);//输出,不用空格或换行
    	}
    }
    int main(){//主函数
    	int n=read();
    	for(int i=0;i<=n;i++) a[i].l=read(),a[i].r=read();
    	sort(a+1,a+n+1,cmp);//排序
    	pro[0]=1;//注意乘积数组初始值为1
    	for(int i=0;i<=n;i++){//注意从0开始,国王
    		div(pro,tmp,a[i].r);//先除到tmp上
    		if(more(tmp,ans)) copy(ans,tmp);//比较,满足就复制
    		times(pro,a[i].l);//自乘
    	}
    	print(ans);//输出
    	return 0;//华丽结束
    }
    
    • 0

      不讲了,直接上代码

      #include<bits/stdc++.h>

      using namespace std;

      int a[10005],n,len,x,y;

      struct node{

      long long a,b;
      

      }use[10005];

      bool cmp(const node x,const node y){

      return x.a*x.b < y.a*y.b;
      

      }

      void multiply(int x){

      for(int i=1;i<=len;i++)a[i]*=x;
      
      for(int i=1;i<=len;i++){
      
      	if(a[i]>=10){
      
      		a[i+1]+=a[i]/10;
      
      		a[i]%=10;
      
      	}if(i==len&&a[i+1]!=0)len++;
      
      }
      

      }

      void divide(int mod){

      int rest=a[len],i=len-1;
      
      for(;i>0;i--){
      
      	if(rest>=mod)break;
      
      	rest=rest*10+a[i];
      
      }if(rest<mod){
      
      	printf("1");
      
      	return;
      
      }while(i>0){
      
      	printf("%d",rest/mod);
      
      	rest%=mod;
      
      	rest=rest*10+a[i--];
      
      }printf("%d",rest/mod);
      

      }

      int main(){

      scanf("%d%d%d",&n,&x,&y);
      
      for(long long i=1;i<=n;i++)scanf("%d%d",&use[i].a,&use[i].b);
      
      sort(use+1,use+n+1,cmp);
      
      a[1]=x;len=1;
      
      for(int i=1;i<n;i++)multiply(use[i].a);
      
      divide(use[n].b);
      
      return 0;
      

      }

      • 1

      信息

      ID
      39
      时间
      1000ms
      内存
      128MiB
      难度
      6
      标签
      递交数
      24
      已通过
      10
      上传者