栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

《算法竞赛进阶指南》 国王游戏

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《算法竞赛进阶指南》 国王游戏

恰逢 HH 国国庆,国王邀请 nn 位大臣来玩一个有奖游戏。

首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。

然后,让这 nn 位大臣排成一排,国王站在队伍的最前面。

排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:

排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

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

注意,国王的位置始终在队伍的最前面。

输入格式

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

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

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

输出格式

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

数据范围

1≤n≤10001≤n≤1000
0

输入样例:

3
1 1
2 3
7 4
4 6

输出样例:

2

解题思路觉得书上写的很好:

 

 

代码:

#include 
#include 
#include 
#include 
#include 

using namespace std;

const int N = 1010;

typedef pair PII;

int n;
PII ps[N];

vector mul(vector a, int b)//高精度乘法
{
    int t = 0;
    vector c;
    for (int i = 0; i < a.size(); i ++ )
    {
        t += a[i] * b;
        c.push_back(t % 10);
        t /= 10;
    }

    while (t)
    {
        c.push_back(t % 10);
        t /= 10;
    }

    return c;
}

vector div_vec(vector a, int b)//高精度除法
{
    int t = 0;
    vector c;
    bool is_first = false;//防止前导0
    for (int i = a.size() - 1; i >= 0; i -- )
    {
        t = t * 10 + a[i];
        int x = t / b;
        if (is_first || x)
        {
            is_first = true;
            c.push_back(x);
        }

        t %= b;
    }

    reverse(c.begin(), c.end());

    return c;
}

vector max_vec(vector a, vector b)//比较两数大小
{
    if (a.size() > b.size()) return a;
    if (b.size() > a.size()) return b;
    if (vector(a.rbegin(), a.rend()) > vector(b.rbegin(),b.rend())) return a;
    return b;
}

int main()
{
    cin >> n;
    for (int i = 0; i <= n; i ++ )
    {
        int left, right, mul;
        scanf("%d %d", &left, &right);
        mul = left * right;
        ps[i] = {mul, left};
    }

    sort(ps + 1, ps + n + 1);

    vector res;
    vector mul_sum;
    res.push_back(0);
    mul_sum.push_back(1);

    for (int i = 0; i <= n; i ++ )
    {
        if (i) res = max_vec(res, div_vec(mul_sum, ps[i].first / ps[i].second));
        mul_sum = mul(mul_sum, ps[i].second);//计算前i个数的乘积
    }

    for (int i = res.size() - 1; i >= 0; i -- )
        printf("%d", res[i]);

    return 0;
}

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995805.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号