Acwing 125. 国王游戏(模拟+高精度乘除法 + 贪心)

传送门

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

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

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

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

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

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

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

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

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

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

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

数据范围
1≤n≤1000
0<a,b<10000
输入样例:
3
1 1
2 3
7 4
4 6
输出样例:
2

这个题太恶心了,调了接近一个小时才调出来,,fo了


思路:贪心,将所有数按左右手相加总和从小到大排序,一定满足题目所说的最大值最小,这个证明比较麻烦,想看的可以戳这里 贪心证明 接下来模拟就可以了。


代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1005;
struct node
{
    int x,y;
    bool operator < (node m) const
    {
        return x+y<m.x+m.y;
    }
}a[N];
string multi(string a,int b)
{
    string ans("");
    int t=0;
    if(a.size()==1 && a[0]=='0') a[0]='1';
    reverse(a.begin(),a.end());
    for(int i=0;(i<a.size())||t;i++)
    {
        if(i<a.size())
            t+=(a[i]-'0')*b;
        ans+=t%10+'0';
        t/=10;
    }    
   reverse(ans.begin(),ans.end());   
    return ans;
}
string divide(string a,int b)
{
    string ans("");
    int t=0;
    for(int i=0;i<a.size();i++)
    {
        t=t*10+a[i]-'0';
        ans+=t/b+'0';
        t%=b;
    }
    int i=0;while(i<ans.size()-1&&ans[i]=='0') i++;
    string x(ans,i,ans.size()-i+1);
    return x;
}
bool comp(string a,string b)
{
    if(a.size()!=b.size())
        return a.size()<b.size();
    for(int i=0;i<a.size();i++)
        if(a[i]!=b[i])
            return a[i]-'0'<b[i]-'0';
    return true;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<=n;i++)
        cin>>a[i].x>>a[i].y;
    sort(a+1,a+n+1);
    string ans,sum,tem;
    tem="0";ans="0";sum="0";
    for(int i=0;i<=n;i++)
    {
        tem=divide(sum,a[i].y);
        if(comp(ans,tem)) ans=tem;
        sum=multi(sum,a[i].x);
    }
    cout<<ans<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章