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;
}
}