算法提高 快乐司机(贪心法,排序使用了接口,不超时)
2018-02-12 20:44
323 查看
代码如下:
下面代码一直超时。
package ADV_167; import java.util.Scanner; public class Main { public int w; public int v; public double c; public Main(int w, int v, double c) { this.w = w; this.v = v; this.c = c; } public Main() { super(); // TODO Auto-generated constructor stub } public int getW() { return w; } public void setW(int w) { this.w = w; } public int getV() { return v; } public void setV(int v) { this.v = v; } public double getC() { return c; } public void setC(double c) { this.c = c; } public static void main(String[] args) { Scanner cin=new Scanner(System.in); int n=cin.nextInt(); int y=cin.nextInt(); Main list[]=new Main ; for(int i=0;i<n;i++){ list[i]=new Main(); list[i].w=cin.nextInt(); list[i].v=cin.nextInt(); list[i].c=1.0*list[i].v/list[i].w; } double temp1; int temp2; int temp3; for(int i=0;i<n-1;i++) { int k=i; for(int j=i+1;j<n;j++){ if(list[k].c<list[j].c){ k=j; } } if(k!=i){ temp1=list[i].c; list[i].c=list[k].c; list[k].c=temp1; temp2=list[i].w; list[i].w=list[k].w; list[k].w=temp2; temp3=list[i].v; list[i].v=list[k].v; list[k].v=temp3; } } double cleft=y; int i=0; double b=0; while(i<n&&list[i].w<cleft){ cleft-=list[i].w; b+=list[i].v; i++; } if(i<n) b+=1.0*list[i].v*cleft/list[i].w; System.out.println(String.format("%.1f",b)); } }
改进算法,依旧超时:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public int w; public int v; public double c; public Main(int w, int v, double c) { this.w = w; this.v = v; this.c = c; } public static void main(String[] args) { Scanner cin=new Scanner(System.in); int n=cin.nextInt(); int w=cin.nextInt(); List<Main> list=new ArrayList<Main>(); for(int i=0;i<n;i++){ int g=cin.nextInt(); int p=cin.nextInt(); double c=1.0*p/g; Main main=new Main(g,p,c); list.add(main); } double temp1; int temp2; int temp3; for(int i=0;i<n-1;i++) { int k=i; for(int j=i+1;j<n;j++){ if(list.get(k).c<list.get(j).c){ k=j; } } if(k!=i){ temp1=list.get(i).c; list.get(i).c=list.get(k).c; list.get(k).c=temp1; temp2=list.get(i).w; list.get(i).w=list.get(k).w; list.get(k).w=temp2; temp3=list.get(i).v; list.get(i).v=list.get(k).v; list.get(k).v=temp3; } } double cleft=w; int i=0; double b=0; while(i<n&&list.get(i).w<cleft){ cleft-=list.get(i).w; b+=list.get(i).v; i++; } if(i<n) b+=1.0*list.get(i).v*cleft/list.get(i).w; System.out.println(String.format("%.1f",b)); } }
借鉴别人的方法:
基础知识:
1.什么是Comparable接口
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。
package ADV_167; import java.util.Arrays; import java.util.Scanner; public class Main { public static class Values implements Comparable<Values>{ public int p;//价格 public int w;//重量 public double value;//性价比 public Values(int p, int w, double value) { this.p = p; this.w = w; this.value = value; } @Override public int compareTo(Values o) { // TODO Auto-generated method stub if(o instanceof Values){ /* *指定对象为o * 如果o.value>value -1 * o.value<value 1 * o.value=value 0 */ double cmp=value-o.value; if(cmp>0) return 1; else if(cmp<0) return -1; else return 0; } return 0; } } public static void main(String[] args) { Scanner cin=new Scanner(System.in); int n=cin.nextInt();//n表示物品的数量 int w=cin.nextInt();//汽车的核载重量 int gi[]=new int ;//每个物品的重量 int pi[]=new int ;//每个物品的价值 Values values[]=new Values ; double sum=0; for(int i=0;i<n;i++){ gi[i]=cin.nextInt(); pi[i]=cin.nextInt(); values[i]=new Values(pi[i],gi[i],1.0*pi[i]/gi[i]);//最后一个参数为性价比 } Arrays.sort(values); for(int i=n-1;i>=0;i--){ if(w>values[i].w){ sum+=values[i].p; w=w-values[i].w; }else{ sum+=w*values[i].value;//重量*性价比等于价值 break; } } System.out.print(String.format("%.1f",sum)); } }
相关文章推荐
- 蓝桥杯_算法提高_快乐的司机(快速排序、贪心算法)
- 算法提高 快乐司机 (排序,贪心)
- 蓝桥杯 - 算法提高 快乐司机 ( 排序+贪心 )
- 算法提高 快乐司机
- 蓝桥杯 算法提高 快乐司机
- 蓝桥杯 算法提高 快乐司机
- 蓝桥杯 ADV-167算法提高 快乐司机(贪心算法)
- 蓝桥杯算法提高 快乐司机
- 算法提高 快乐司机
- 【ShawnZhang】带你看蓝桥杯——算法提高 快乐司机
- 蓝桥网 算法提高 快乐司机
- 蓝桥杯 算法提高 快乐司机
- 蓝桥杯 ADV-167算法提高 快乐司机(贪心算法)
- 算法提高 快乐司机
- 算法笔记_102:蓝桥杯练习 算法提高 快乐司机(Java)
- 蓝桥杯 贪心模板 _算法提高 快乐司机
- 蓝桥杯 算法提高 快乐司机 (贪心)
- 蓝桥杯--算法提高 快乐司机
- 算法提高 快乐司机
- 关于如何使用pthread_cond_timedwait()超时接口