【NOIP2012 提高组 day1】国王游戏

一、题目描述
【NOIP2012 提高组 day1】国王游戏_第1张图片

二、分析
先说思路,这道题是贪心。
来推一下:
设有三个大臣,那么假设序列为:

  • x y
  • a0 b0
  • a1 b1
  • a2 b2
    那么三位大臣得到钱的数量分别为

第一位:
第二位: = ×
第三位: = ×

所以就可以发现了,因为当前与上一位得到的不同之处就在于后面一个东西,又因为分母是由自身决定的,而分子是由上一个决定的,所以要想让最大值最小,就必须按照(ai * bi)的优先级排序,然后就可以扫一遍找最大值就好了。

注意高精度。

三、代码

#include
#define MAXN 10005
using namespace std;
int a[10005],n,len,x,y;
struct each{
    long long a,b;
}use[10005];
bool cmp(const each x,const each 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(restprintf("1");
        return;
    }
    while(i>0)
    {
        printf("%d",rest/mod);
        rest%=mod;
        rest=rest*10+a[i--];
    }
    printf("%d",rest/mod);
}
int main()
{
    cin>>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; iuse[i].a);
    }
    divide(use[n].b);
    return 0;
}

你可能感兴趣的:(【NOIP2012 提高组 day1】国王游戏)