蓝桥杯真题【答疑】

蓝桥杯真题【答疑】

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改



public class Main {
    public static void main(String[] args) {
      /*
      思路:
      本题的目的是所有同学的s+a总时刻之和最少,但这里需注意的是,每个同学只有在前一个同学的s+a+e这一个
      流程都做完后,才能接着自己的流程。所有同学的s+a总时刻之和最少,注意是时刻,不是每个人单独走完自己
      s+a这个过程的时间,时刻在这里可以理解为每个同学到能够发消息前的等待时间,所以是所有同学轮到自己能够
      发消息的等待时间之和,每个同学自己的等待之间s+a叠加了前面同学过完一遍问问题流程s+a+e的时间,
      所以利用贪心算法的优先选择原理:
      1、优先选择s+a+e的同学用时最短的排到前面;
      2、如果两个同学s+a+e相同,那么比较s+a,把s+a短的放前边;
      3、排完序后计算每个同学的等待发送消息时刻,注意是叠加了前面同学完整问问题的时间,
      即T(i)=s(i)+a(i)+(T(i-1)+e(i-1)) T(1)=s(1)+s(1);
      4、所有同学总的等待时刻之和为sum(T(i));

      可以参考:
      https://blog.csdn.net/bdu_zhangAo/article/details/109714422

      import java.util.*;
      public class Main{
          public static void main(String[] args) {
              Scanner scan = new Scanner(System.in);
              int n = scan.nextInt();
              People[] people = new People[n];
              for (int i=0;i<n;i++){
                  int s,a,e;
                  s=scan.nextInt();
                  a=scan.nextInt();
                  e=scan.nextInt();
                  people[i] = new People(s,a,e);
              }
              Arrays.sort(people, new Comparator<People>() {
                  @Override
                  public int compare(People o1, People o2) {
                      if(o1.sum-o2.sum>0){
                        return 1;
                      }else if(o1.sum-o2.sum<0){
                        return -1;
                      }else if(o1.two>=o2.two){
                        return 1;
                      }else{
                        return -1;
                      }
                  }
              });
              long ans = 0,last=0,time=0;
              for (int i=0;i<n;i++){
                  ans += people[i].s+people[i].a +time;
                  time += people[i].sum;
              }
              System.out.println(ans);
              scan.close();
          }
      }

      class People{
          int s;
          int a;
          int e;
          int two;
          int sum;
          People(int s,int a,int e){
              this.s=s;
              this.a=a;
              this.e=e;
              this.sum=s+a+e;
              this.two=s+a;
          }
      }
      */
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        scan.close();
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值