YbtOJ练习:贪心 例题4国王游戏

虽然这道题是一道例题,但是因为它用到了我不大熟悉的高精度算法,所以还是决定写一写。

至于证明过程相信无论是在书上,还是网上,聪明的你都已经知道了。

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,mul[N*4],Div[N*4],ans[N*4],temp[N*4];
struct node {
    int l,r;
    bool operator < (const node &G) const
    {
        return l*r<G.l*G.r;
    }
}hands[N];
void multify(int x)
{
    for(int i=1;i<=mul[0];i++) mul[i]*=x;
    for(int i=1;i<=mul[0];i++) 
    {
        mul[i+1]+=mul[i]/10;
        mul[i]%=10;
    }
    while(mul[mul[0]+1])
    {
        mul[0]++;
        mul[mul[0]+1]+=mul[mul[0]]/10;
        mul[mul[0]]%=10;
    }
}
void Divide(int x)
{
    memcpy(temp,mul,sizeof(mul));
    Div[0]=mul[0];
    int t=0;
    for(int i=temp[0];i;i--)
    {
        t=t*10+temp[i];
        if(t>=x)
        {
            Div[i]=t/x;
            t%=x;
        }
        else Div[i]=0;
    }
    while(Div[Div[0]]==0&&Div[0]>1) Div[0]--;
}
void max()
{
    if(Div[0]>ans[0]) memcpy(ans,Div,sizeof(Div));
    for(int i=Div[0];i;i--)
     if(Div[i]>ans[i])
     {
         memcpy(ans,Div,sizeof(Div));
         break;
     }
}
void print()
{
    while(ans[ans[0]]==0&&ans[0]>1) ans[0]--;
    for(int i=ans[0];i;i--) printf("%d",ans[i]);
}
int main()
{
    scanf("%d",&n);
    scanf("%d%d",&hands[0].l,&hands[0].r);
    for(int i=1;i<=n;i++) scanf("%d%d",&hands[i].l,&hands[i].r);
    sort(hands+1,hands+n+1);
    mul[0]=1;mul[1]=1;
    multify(hands[0].l);
    for(int i=1;i<=n;i++)
    {    
        Divide(hands[i].r);
        multify(hands[i].l);
        max();
    }
    print();
    return 0;
}
原文地址:https://www.cnblogs.com/smartljy/p/13433047.html