原題:http://acm.hdu.edu.cn/showproblem.php?pid=1009
Problem Description:
FatMouse準備了M磅的Cat-Food,以便用來跟小Cat交換好吃的JavaBean。
現在有N個房間,第i個房間有J[i]磅的JavaBean,其交換的籌碼是F[i]磅的Cat-Food。
當然,FatMouse還是有很大的選擇權的,對任意一個房間,它可以只交換一部分的Cat-Food。
現要求FatMouse以怎樣的策略才能獲得最多的Cat-Food。
Solution:貪心入門題,對象數組排序時我用到了Comparator接口,個人在這上面花了點時間。
JAVA 代碼(AC):
import java.util.Arrays;
import java.util.Scanner;
public class Main {
/**
* 稻草人
* HDU 1009(AC)
*/
public static Node[] node = new Node[1001];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext())
{
int mNum = in.nextInt();
int nNum = in.nextInt();
if(mNum==-1&&nNum==-1)
break;
for(int i=0;i<nNum;i++)
{
node[i] = new Node();
node[i].javaBeans = in.nextInt();
node[i].food = in.nextInt();
node[i].rex = node[i].javaBeans*(1.0)/node[i].food;
}
Arrays.sort(node,0, nNum);
getAns(mNum,nNum);
}
}
public static void getAns(int m,int n)
{
double reSum=0.0;
for(int i=0;i<n;i++)
{
if(node[i].food<=m){
m-=node[i].food;
reSum+=node[i].javaBeans;
}
else
{
reSum+=node[i].javaBeans*(1.0)*m/node[i].food;
break;
}
}
System.out.printf("%.3f",reSum);
System.out.println();
}
}
class Node implements Comparable<Node>
{
int javaBeans;
public int getJavaBeans() {
return javaBeans;
}
public void setJavaBeans(int javaBeans) {
this.javaBeans = javaBeans;
}
public int getFood() {
return food;
}
public void setFood(int food) {
this.food = food;
}
int food;
double rex;
public double getRex() {
return rex;
}
public void setRex(double rex) {
this.rex = rex;
}
@Override
public int compareTo(Node o) {
// 從大到小排序
if(o.getRex()>this.rex)
return 1;
else if(o.getRex()<this.rex)
return -1;
else
return 0;
}
}