codevs 1198 国王游戏

Posted 蒟蒻sjy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 1198 国王游戏相关的知识,希望对你有一定的参考价值。

题目描述 Description

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

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

输入描述 Input Description

第一行包含一个整数 n,表示大臣的人数。

第二行包含两个整数a和b,之间用一个空格隔开,分别表示国王左手和右手上的整数。

接下来n行,每行包含两个整数a和b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

输出描述 Output Description

输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的

金币数。

样例输入 Sample Input

3

1 1

2 3

7 4

4 6

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

【输入输出样例说明】

按 1、2、3号大臣这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

按 1、3、2这样排列队伍,获得奖赏最多的大臣所获得金币数为2;

按 2、1、3这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

按 2、3、1这样排列队伍,获得奖赏最多的大臣所获得金币数为 9;

按 3、1、2这样排列队伍,获得奖赏最多的大臣所获得金币数为 2;

按 3、2、1这样排列队伍,获得奖赏最多的大臣所获得金币数为 9。

因此,奖赏最多的大臣最少获得 2 个金币,答案输出 2。

 

【数据范围】

对于20%的数据,有1≤ n≤ 10,0 < a、b < 8;

对于40%的数据,有1≤ n≤20,0 < a、b < 8;

对于60%的数据,有1≤ n≤100;

对于60%的数据,保证答案不超过 10^9;

对于100%的数据,有 1 ≤ n ≤1,000,0 < a、b < 10000。

 

题解:最优方案就是按A * B递增排序的方案(注意使用高精度)。

 

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 6005
#define ll long long
using namespace std;
struct note
{
    ll a,b,c;
}a[1005];
bool cmp(note x,note y)
{
    return x.c<y.c;
}
int n,bz,i,j;
int sum[N],ans[N],t[N];
char s[5];
void chu(int x)
{
    int yu=0;
    memset(t,0,sizeof(t));
    for (j=sum[0];j>=1;j--)
    {
        yu=yu*10+sum[j];
        if(yu>=x)
        {
            if(!t[0]) t[0]=j;
            t[j]=yu/x;
            yu%=x;
        }
    }
}
void mx()
{
    if(t[0]>ans[0]) memcpy(ans,t,sizeof(ans));
    else if(ans[0]==t[0])
    {
        for (j=ans[0];j>=1;j--)
            if(t[j]>ans[j])
            {
                memcpy(ans,t,sizeof(ans));
                return;
            } 
            else if(ans[j]<t[j]) return;
    }
}
void cheng(int x)
{
    int t[N];
    memset(t,0,sizeof(t));
    for (j=1;j<=sum[0];j++)
    {
        t[j]=t[j]+sum[j]*x;
        t[j+1]+=t[j]/10;
        t[j]%=10;
    }
    for(t[0]=sum[0];t[t[0]+1];) 
      t[++t[0]+1]+=t[t[0]]/10,t[t[0]]%=10;
    memcpy(sum,t,sizeof(sum));
}
int main()
{
    scanf("%d",&n);
    scanf("%s",s+1);
    for (i=strlen(s+1);i>=1;i--) 
      sum[++sum[0]]=s[i]-\'0\';
    scanf("%d",&bz);
    for (i=1;i<=n;i++) 
      scanf("%lld%lld",&a[i].a,&a[i].b),a[i].c=a[i].a*a[i].b;
    sort(a+1,a+n+1,cmp);
    for (i=1;i<=n;i++)
    {
        chu(a[i].b);
        mx();
        cheng(a[i].a);
    }
    for (i=ans[0];i>=1;i--) printf("%d",ans[i]);
    return 0;
}
View Code

 

以上是关于codevs 1198 国王游戏的主要内容,如果未能解决你的问题,请参考以下文章

codevs1198 国王游戏

CodeVS 1198NOIP 2012国王游戏

1198 国王游戏

CODEVS 2451 互不侵犯

AC日记——国王游戏 洛谷 P1080

国王游戏解题报告