您的位置:首页 > 其它

算法提高 快乐司机(贪心法,排序使用了接口,不超时)

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: