3 条题解

  • 2

    不讲了,直接上代码

    #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;
    

    }

    • 0
      @ 2024-2-16 9:32:23
      #include<string.h>
      #include<stdio.h>
      #include<algorithm>
      using namespace std;
      struct node{
      	int a,b;
      	char cnta[10000],all[10000];//cnta 为前面所有a的乘积的逆序 all为乘积正序 
      	char ca[100];//a转化为字符数组 
      	char ans[10000];//所获得金币数 
      	int lans;
      }da[1001];
      bool cmp(node a,node b){
      	return a.a*a.b<b.a*b.b;
      }
      bool cmp2(node a,node b){//高精度比较 
      	if(a.lans!=b.lans)
      		return a.lans>b.lans;
      	else{
      		int i;
      		for(i=0;i<a.lans;i++)
      			if(a.ans[i]==b.ans[i]) {
      				continue;
      			}
      			else return a.ans[i]>b.ans[i];
      	}
      	return 1==1;
      }
      void doit(int a,char b[]){//将数值转化成字符数组
      	int lb=0;
      	while(a>0){
      		b[lb++]=a%10+'0';
      		a/=10;
      	}
      	b[lb]='\0';
      }
      void add(char c[],char d[],int i){//错位相加 
      	int lc=strlen(c),j;
      	int jw = 0,tmp;
      	for(j=0;j<lc;j++,i++){
      		tmp=(d[i]>0?d[i]-'0':0)+c[j]-'0'+jw;
      		d[i]=tmp%10+'0';
      		jw=tmp/10;
      	}
      	if(jw){
      		d[i++]=jw+'0';
      	}
      	d[i]='\0';
      }
      void gc(char a[],char b[],char d[]){//高乘 
      	int la=strlen(a);
      	int lb=strlen(b);
      	int i,j;
      	char c[10000];//记录乘数的每一位乘以被乘数的积 
      	for(i=0;i<la;i++){
      		int tmp;
      		int jw = 0;
      		int lc = 0;
      		for(j=0;j<lb;j++){
      			tmp = (a[i]-'0') * (b[j]-'0') + jw;
      			c[lc++] = tmp % 10 + '0';
      			jw = tmp / 10;
      		}
      		if(jw) c[lc++]=jw+'0';
      		c[lc]='\0';
      		add(c,d,i);
      	}
      }
      void mult(char a[],int b, char c[]){
      	int i = 0 , tag = 0 , la = strlen(a) , lc = 0;
      	int d = 0;
      	while(i<=la){
      		if(b>d){
      			d=d*10+a[i++]-'0';
      			if(tag) c[lc++]='0';
      		}else{
      			c[lc++]=d/b+'0';
      			d=d%b;
      			d=d*10+a[i++]-'0';
      			tag = 1;
      		}
      	}
      	if(tag==0)c[lc++]='0';
      	c[lc]='\0';
      }
      int main(){
      	int n,i,j;
      	memset(da,0,sizeof(da));
      	scanf("%d",&n);
      	scanf("%d%d",&da[0].a,&da[0].b);
      	for(i=1;i<=n;i++){
      		scanf("%d%d",&da[i].a,&da[i].b);
      	}
      	sort(da+1,da+n+1,cmp);
      	doit(da[0].a,da[0].ca); 
      	da[0].cnta[0]='1';
      	da[0].cnta[1]='\0';
      	for(i=1;i<=n;i++){//得到前面大臣左手金币数的乘积的逆序 
      		doit(da[i].a,da[i].ca);
      		gc(da[i-1].cnta,da[i-1].ca,da[i].cnta);
      	}
      	for(i=1;i<=n;i++){//将乘积逆转 
      		int k=0;
      		for(j=strlen(da[i].cnta)-1;j>=0;j--)
      			da[i].all[k++]=da[i].cnta[j];
      		da[i].all[k]='\0';
      	}
      	for(i=1;i<=n;i++){//得到每一位大臣能获得的金币数 
      		mult(da[i].all,da[i].b,da[i].ans);
      		da[i].lans = strlen(da[i].ans);
      	}
      	int ans = 1;
      	for(i=2;i<=n;i++){
      		if(!cmp2(da[ans],da[i]))
      			ans=i;
      	}
      	printf("%s\n",da[ans].ans);
      	return 0;
      }
      
      • -1
        @ 2022-8-19 17:36:02
        #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;//华丽结束
        }
        
        • 1

        信息

        ID
        81
        时间
        1000ms
        内存
        125MiB
        难度
        4
        标签
        递交数
        25
        已通过
        10
        上传者