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

这里写图片描述
这里写图片描述

代码如下:
这里写图片描述

下面代码一直超时。

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[n];
        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[n];//每个物品的重量
        int pi[]=new int[n];//每个物品的价值
        Values values[]=new Values[n];
        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));
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值