首页 > 代码库 > CODEVS1198国王游戏noip2012T2

CODEVS1198国王游戏noip2012T2

 题目描述 Description

恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

思路:(自己的思路比较乱,就从网上copy了一个,很清晰!!!)

首先我们分析一下 如果i和j两个相邻那么i排在j前面的必要条件是  total * a[i] / b[j]  <  total * a[j] /b[i] 也就是说 a[i]*b[i] < a[j]*b[j]
 
这样就立刻确定了顺序(有序性在信息学竞赛中的应用)
 

接下来就是模拟出每个大臣得到的数,直接使用一下高精度计算即可。

code:

#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cstring>

using namespace std;

struct use{

int le,ri,sum,p;

}a[1001];

struct use1{

int l,num[10001]; 

}c[1001],d[1001],ans;

int my_comp(const use&x,const use&y)

{

if (x.sum<y.sum) return 1;

else return 0;

}

struct use1 mul(struct use1 x,int y)

{

int  i,g=0;

for (i=1;i<=x.l;++i)

{

x.num[i]=x.num[i]*y+g;

g=x.num[i]/10;

x.num[i]=x.num[i]%10;

}

while (g>0)

{

++x.l;

x.num[x.l]=g%10;

g=g/10;

}

return x;

}

struct use1 div(struct use1 x,int y)

{

int i,j,g=0;

struct use1 anss;

anss.l=x.l;

for (i=x.l;i>=1;--i)

{

 g=g*10+x.num[i];

   anss.num[i]=g/y;

   g=g%y;

}

while (anss.l>1&&anss.num[anss.l]==0)

--anss.l;

return anss;

}

struct use1 maxn(struct use1 x,struct use1 y)

{

int i;

if (x.l>y.l) return x;

if (y.l>x.l) return y;

if (y.l==x.l)

{

for (i=x.l;i>=1;--i)

{

if (x.num[i]>y.num[i]) return x;

if (x.num[i]<y.num[i]) return y;

}

return x;

}

}

int main()

{

int n,i,j,t;

memset(ans.num,0,sizeof(ans.num));

ans.l=0;

cin>>n;

cin>>a[0].le>>a[0].ri;

a[0].sum=a[0].le*a[0].ri;

a[0].p=0;

    for (i=1;i<=n;++i)

    {

    cin>>a[i].le>>a[i].ri;

    a[i].sum=a[i].le*a[i].ri;

    a[i].p=i;

    }

    sort(a+1,a+n+1,my_comp);

    t=a[0].le;

    while (t>0) 

    {

    ++c[0].l;

    c[0].num[c[0].l]=t%10;

    t=t/10;

    }

    for (i=1;i<=n;++i)

    {

    c[i]=mul(c[i-1],a[i].le);

    d[i]=div(c[i-1],a[i].ri);

    if (a[i].p!=0)

      ans=maxn(ans,d[i]);

    }

    for (i=ans.l;i>=1;--i)

      cout<<ans.num[i];

    cout<<endl;

}  

CODEVS1198国王游戏noip2012T2