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
#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
#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
- 上传者