转载声明:原文转自: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. 《c程序设计语言》读书笔记--统计换行数,空格数,tab数

    #include <stdio.h> int main() { int spa = 0,lin = 0,tab = 0; int c; /* spa代表空格个数,tab代表制表符个数,li ...

  2. Kobject结构体分析

    kobject是组成设备device.驱动driver.总线bus.class的基本结构.如果把前者看成基类,则后者均为它的派生产物.device.driver.bus.class构成了设备模型,而k ...

  3. poj - 2377 Bad Cowtractors&&poj 2395 Out of Hay(最大生成树)

    http://poj.org/problem?id=2377 bessie要为FJ的N个农场联网,给出M条联通的线路,每条线路需要花费C,因为意识到FJ不想付钱,所以bsssie想把工作做的很糟糕,她 ...

  4. Java类的初始化过程及清理

    一.类的数据成员初始化 Java中类的数据成员初试化可能有两种形式. 在定义类成员变量的地方直接提供初始化值(这是C++中不允许的) 在构造器中初试化.(Java中不存在类似C++中的初始化列表) 两 ...

  5. 第六讲(二) Hibernate HQL查询

    HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibe ...

  6. zookeeper监控告警

    一.ZooKeeper简介 ZooKeeper作为分布式系统中重要的组件,目前在业界使用越来越广泛,ZooKeeper的使用场景非常多,以下是几种典型的应用场景: l  数据发布与订阅(配置中心) l ...

  7. JUnit 4

    本文是转载的, 主要介绍 Junit 4 ( 搭建在 eclipse 中 ) JUnit4 初体验 Eclipse: 下载 Ant, 基于java的开源构建工具, 你可以在 http://ant.ap ...

  8. JS function的定义方法,及function对象的理解。

    废话篇: 今天看到了Function的内容,各种晕,各种混淆有木有.简直是挑战个人脑经急转弯的极限啊.不过,最终这一难题还是被我攻克了,哇咔咔.现在就把这东西记下来,免得到时候又忘了就悲催了.... ...

  9. Qt之模式、非模式、半模式对话框

    简述 关于"模式"和"非模式"对话框,相信大家都比较熟悉,但其中有一个可能很多人都比较陌生,介于两者之间的状态,我们称之为"半模式". 简述 ...

  10. CodeForces Round #297 Div.2 E (中途相遇法)

    当时打比赛的时候卡在D题了,没有看E.现在看来E还是不难的. 将n个数排序后,其实不排序也是可以的,只是排序能快一半的时间. 枚举前一半能得到多少种和,放到map里面: 然后在后一半数中枚举,然后在m ...