转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5564311.html

这个道题有几点要注意的:

  数组存放的类型:float或double

  打印的格式:(如果只是System.out.printf("%.3f\n",maxF); //会报Presentation Error)另外是:Java 中的printf -----不存在"%lf"这个情况...

System.out.printf("%.3f",maxF);//maxF为输出结果 即最大鼠食
System.out.println();

  还有一点要注意的是如果M值等于一个房间的猫粮的大小时,M不能与F[i]/J[i]相乘,会导致结果出错,

           不过这一点,思路清晰的人应该不会有问题。

以下是JAVA语言实现:

  数组实现的代码:

import java.util.*;
import java.io.*; /**
*数组实现,实现当中运用了快排,具体见static方法
*/
public class Main{ public static void main(String[] arg){
Scanner scan = new Scanner(new BufferedInputStream(System.in));
int m,n;
while((m=scan.nextInt())!=-1&&(n=scan.nextInt())!=-1){
double f[] = new double[n];//鼠食
double j[] = new double[n];//猫粮
double a[] = new double[n];
double maxF=0;
for(int i =0 ; i != n ; i ++){
f[i] = scan.nextDouble();
j[i] = scan.nextDouble();
a[i] = f[i]/j[i];
}
sort(a,f,j);
for(int i =n-1 ; i !=-1 ; i -- ){
if(m>=j[i]){//这里必须打等于号 不然会导致结果不准确 ACM会WA
m -= j[i];
maxF += f[i];
}else{
maxF += m*a[i];
break;
}
}
System.out.printf("%.3f",maxF);
System.out.println();
}
scan.close();
} static void sort(double[] a,double[] b,double[] c) {
int len = a.length;
int low = 0,high = len - 1;
quickSort(a,b,c, low, high);
} static void quickSort(double[] a,double[] b, double[] c,int l ,int h){
if(l>=h){
return;
}
int low = l;
int high = h;
double k = a[low];
double k2 = b[low];
double k3 = c[low];
while(low< high){
//
while(high>low&&a[high]>=k){//寻找元素右边比其小的
high --;
}
a[low] = a[high];//进行交换,K指向high
b[low] = b[high];
c[low] = c[high];
while(low<high&&a[low]<=k){//寻找元素左边比其大的
low++;
}
a[high] = a[low];//进行交换,K指向low
b[high] = b[low];
c[high] = c[low];
}
a[low] = k;//将K赋给low
b[low] = k2;
c[low] = k3;
quickSort(a,b, c,l, low-1);
quickSort(a,b, c,low+1, h);
} }

为了体现JAVA的OOP实现,我还写了用类实现的方法

以下是封装类实现的代码:

import java.util.*;
import java.io.*; public class Main{ public static void main(String[] arg){
Scanner scan = new Scanner(new BufferedInputStream(System.in));
int m,n;
while((m=scan.nextInt())!=-1&&(n=scan.nextInt())!=-1){
ArrayList<Trade> trades = new ArrayList<>(n);
double maxF=0;
for(int i =0 ; i != n ; i ++){
Trade trade = new Trade();
trade.setF(scan.nextDouble());
trade.setJ(scan.nextDouble());
trades.add(trade);
}
Collections.sort(trades);
for(int i =0 ; i !=n ; i ++ ){
Trade trade = trades.get(i);
if(m>= trade.getJ() ){
m -= trade.getJ() ;
maxF += trade.getF() ;
}else{
maxF += m*trade.getA();
break;
}
}
System.out.printf("%.3f",maxF);
System.out.println();
}
scan.close();
} static class Trade implements Comparable<Trade> {
private double f;//鼠食
private double j;//猫粮 @Override
public int compareTo(Trade o) {
if(getA()>o.getA()){
return -1;
}else if(getA()==o.getA()){
return 0;
}
return 1;
} public double getF() {
return f;
} public void setF(double f) {
this.f = f;
} public double getJ() {
return j;
} public void setJ(double j) {
this.j = j;
} public double getA() {//获取性价比
return f/j;
} } }

HDOJ-ACM1009(JAVA) (传说中的贪心算法)分为数组实现 和 封装类实现的更多相关文章

  1. Java蓝桥杯——贪心算法

    贪心算法 贪心算法:只顾眼前的苟且. 即在对问题求解时,总是做出在当前看来是最好的选择 如买苹果,专挑最大的买. 最优装载问题--加勒比海盗 货物重量:Wi={4,10,7,11,3,5,14,2} ...

  2. 算法(Java实现)—— 贪心算法

    贪心算法 应用场景-集合覆盖问题 假设在下面需要付费的广播台,以及广播台新型号可以覆盖的地区,如何选择最少的广播台,让所有地区都可以接收到信号 广播台 覆盖地区 k1 北京.上海.天津 k2 广州.北 ...

  3. Java实现 蓝桥杯 算法提高 数组求和

    试题 算法提高 数组求和 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入n个数,围成一圈,求连续m(m<n)个数的和最大为多少? 输入格式 输入的第一行包含两个整数n, ...

  4. 基于贪心算法求解TSP问题(JAVA)

    概述 前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 详细 代码下载:http://www.de ...

  5. HDOJ 1330 Deck(叠木块-物理题啊!贪心算法用到了一点)

    Problem Description A single playing card can be placed on a table, carefully, so that the short edg ...

  6. Java 算法(一)贪心算法

    Java 算法(一)贪心算法 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.贪心算法 什么是贪心算法?是指在对问题进行求 ...

  7. 《Java算法》贪心算法

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法的经典案例: 跳跃游戏: 给定一个非负整 ...

  8. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

随机推荐

  1. hibernate基础(1)

    hibernate基础1.hibernate介绍与动手入门体验  问题:模型不匹配(java对象模型与数据库关系模型不匹配)  解决: 1.使用JDBC手工转换        2.使用ORM(Obje ...

  2. poj 2773(容斥原理)

    容斥原理入门题吧. Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9798   Accepted: 3 ...

  3. Machine Learning for hackers读书笔记(十)KNN:推荐系统

    #一,自己写KNN df<-read.csv('G:\\dataguru\\ML_for_Hackers\\ML_for_Hackers-master\\10-Recommendations\\ ...

  4. 利用RunTime解决由NSTimer导致的内存泄漏

    NSTimer使用场景 用NSTimer来实现每隔一定时间执行制定的任务,例如最常见的广告轮播图,使用NSTimer实现这个功能很简单代码如下 NSTimer *_timer; _timer = [N ...

  5. 记一次高级java工程师职位的面试

    阿里在业内做java方面的有关开发可谓是一流的.它给我的第一印象,就是办事效率很高. 周日简历发过去,周一电话就打过来了,接到电话后,面试官很客气,问现在方面吗,我说现在在上班,有点忙,然后和面试官约 ...

  6. HDU 5268 ZYB loves Score (简单模拟,水)

    题意:计算Bestcoder四题的得分. 思路:直接模拟,4项分数直接计算后输出.注意不要低于百分之40的分. //#include <bits/stdc++.h> #include &l ...

  7. PHP中括号“{}”的3个作用

    1,将多个独立语句合并为一个复合语句,例如“if .... else ....”中推荐如此使用. 2,在变量的间接引用中进行定界,避免歧义.例如“${$my_var[8]}”与“${$my_var}[ ...

  8. 【JavaScript学习笔记】if使用

    <html> <body> <script language="JavaScript"> var a=4; var b=2; if(a==3) ...

  9. Mac 上安装MySQL

    http://blog.neten.de/posts/2014/01/27/install-mysql-using-homebrew/ http://www.wkii.org/mac-os-x-ins ...

  10. HDU 查找最大元素 2025

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #defin ...