国王游戏

题目

https://www.luogu.org/problemnew/show/P1080

思路

首先我们分析一下,如果i和j两个相邻那么i排在j前面的必要条件是

totala[i]/b[j]a[j]/b[i]

也就是说 a[i]*b[i]

而本题中,n<1000,a,b<10000

1000个10000乘起来。。。。

所以要用高精度,而高精度是以字符读入,那前面的排序要用一遍,麻烦。。。

所以本段程序有了改进:平时的精度数组只存一个一位数,这段程序存了每个大臣的数,每一次乘完都更新一遍,这样以后就可以读入时就处理好先后顺序。

代码

#include
int n,l=1,a[100010],b[100010],c[100010],g[1000010];
void gj1(int x)
{
    for(int i=1;i<=l;i++) g[i]*=b[x];
    for(int i=1;i<=l;i++)
    {
        g[i+1]+=(g[i]/10);
        g[i]%=10;
    }
    l++;
    while(g[l]>9)
    {
        g[l+1]+=(g[l]/10);
        g[l]%=10;
        l++;
    }
    if(g[l]==0) l--;
}
void gj2()
{
    for(int i=l;i>=1;i--)
    {
        g[i-1]+=((g[i]%c[n])*10);
        g[i]/=c[n];
    }
    while(g[l]==0) l--;
    if(l==0) printf("1\n");
}
void qsort(int l,int r)
{
    int i=l,j=r,mid=a[(l+r)/2];
    while(i<=j)
    {
        while(a[i]mid) j--;
        if(i<=j)
        {
            int t=a[i]; a[i]=a[j]; a[j]=t;
            t=b[i]; b[i]=b[j]; b[j]=t;
            t=c[i]; c[i]=a[j]; c[j]=t;
            i++; j--;
        }
    }
    if(l=1;i--) printf("%d",g[i]);
    return 0;
}

你可能感兴趣的:(题解)