洛谷P1080--国王游戏(数学+贪心+大数: python / java)

题意:
洛谷P1080--国王游戏(数学+贪心+大数: python / java)_第1张图片
思路:任取队列中的两个相邻位置来推,假设位置为 i 和 i+1,设位置前面已经积累的左手金币数量为X,对于位置i,ans1=max(X/bi, Xai/ b(i+1))(设max内为y1,y2),交换两位置:ans2=max(X / b(i+1),Xa(i+1)/bi)(设max内为y3,y4),显然,y3<=y2,y1<=y4; 要使ans1y4,即Xai/b(i+1)>Xa(i+1)/bi;
化简有:ai*bi 这样可以看出,要使排序取得最优方案,即给出的奖赏最小,则要按 ai * bi 从小到大排,同时由于数据范围远超过了longlong 范围,故要用java/python写大数(当然也可以C++高精度)

代码如下(含python版及java版):
1.python版:

n=int(input())
a,b=input().split()
a=int(a)
b=int(b)
per=[]
for i in range (1,n+1):
    l,r=input().split()
    per.append((int(l),int(r)))
per.sort(key=lambda x:x[0]*x[1])
ans=-1
nowleft=a
for i in range (0,n):
    ans=max(ans,nowleft//(per[i])[1])
    nowleft*=(per[i])[0]
print(ans)

2.java版:

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main{
    private static class person{
        BigInteger l;
        BigInteger r;
    }
    final static int maxn=10005;
    static person[] per;

    private static class cmp implements Comparator{
        @Override
        public int compare(person a,person b)
        {
            if((a.l).multiply(a.r).compareTo((b.l).multiply(b.r))<0)
            {
                return -1;
            }
            else if((a.l).multiply(a.r).compareTo((b.l).multiply(b.r))==0)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }
    }

    public static void main(String []args){
        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        per=new person[maxn];
        per[0]=new person();
        per[0].l=cin.nextBigInteger();
        per[0].r=cin.nextBigInteger();
        for(int i=1;i<=n;i++)
        {
            per[i]=new person();
            per[i].l=cin.nextBigInteger();
            per[i].r=cin.nextBigInteger();
        }
        Arrays.sort(per,1,n+1,new cmp());

        BigInteger nowleft=per[0].l;
        BigInteger ans=BigInteger.valueOf(0);
        for(int i=1;i<=n;i++)
        {
            ans=ans.max(nowleft.divide(per[i].r));
            nowleft=nowleft.multiply(per[i].l);
        }
        System.out.println(ans);
    }
}

你可能感兴趣的:(算法,#,贪心)