HDOJ1009 贪心

FatMouse’ Trade
一个简单的贪心问题,但是实现其起来并不顺,代码写的臃肿,给的测试用例可以输出正确解,但是最终并没有AC,贴出来回头再看看。
java代码:

import java.math.BigDecimal;
import java.util.Scanner;

public class problem1009greedy {

    static int []order;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scan=new Scanner(System.in);
        while(true){
            int N=0,M=0;
            M=scan.nextInt();
            N=scan.nextInt();
            if(M==-1&&N==-1)
                break;
            if(N==0){
                System.out.println("0.000");
                continue;
            }
            int []J=new int[N];
            int []F=new int[N];
            float []rate=new float[N];
            order=new int[N];
            for(int i=0;i<N;i++){
                J[i]=scan.nextInt();
                F[i]=scan.nextInt();
                if(F[i]==0)
                    rate[i]=Float.MAX_VALUE;
                else
                    rate[i]=(float)J[i]/F[i];
                order[i]=i;
            }
            quicksort(rate,0,N-1);
            float maxamount=0;          
            for(int i=N-1;i>=0;i--){
                if(rate[i]==Float.MAX_VALUE){
                    maxamount+=J[order[i]];
                }
                else if(rate[i]==0){    
                    break;
                }
                else{
                    if(M<F[order[i]]){
                        maxamount+=M*rate[i];
                        break;
                    }
                    else{ 
                        maxamount+=J[order[i]];
                        M-=F[order[i]];
                    }
                }               
            }
            System.out.println(round(maxamount,3,BigDecimal.ROUND_DOWN));
        }

    }

    static int partition(float []A,int p,int r){
        float key=A[r];
        int i=p-1;
        float temp=0;
        int temp2=0;
        //出错的地方,写成了到r
        for(int j=p;j<r;j++){
            if(A[j]<=key){
                i+=1;
                temp=A[j];
                A[j]=A[i];
                A[i]=temp;
                temp2=order[j];
                order[j]=order[i];
                order[i]=temp2;
            }
        }
        temp=A[r];
        A[r]=A[i+1];
        A[i+1]=temp;
        temp2=order[r];
        order[r]=order[i+1];
        order[i+1]=temp2;
        return i+1;
    }

    static void quicksort(float []A,int p,int r){
        if(p<r){
            int q=partition(A,p,r);
            quicksort(A,p,q-1);
            quicksort(A,q+1,r);
        }
    }

   static float round(float value, int scale, int roundingMode) {  
        BigDecimal bd = new BigDecimal(value);  
        bd = bd.setScale(scale, roundingMode);  
        float d = bd.floatValue();  
        bd = null;  
        return d;  
    }  

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值