字节跳动第五题求分享思路

划船,每次运最慢的两个人,两种方案:

  • 最快、次快、再次快-> 最快、次快<- 最快、最慢、次慢-> 最快、再次快<-
  • 最快、次快、最慢-> 最快、次快<- 最快、次快、次慢-> 最快、次快<-

求问这种思路哪里错了,0.00% :(

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int testNum = scanner.nextInt();
        for (int i = 0; i < testNum; i++) {
            int n = scanner.nextInt();
            int[] costs = new int[n];
            for (int j = 0; j < n; j++) {
                costs[j] = scanner.nextInt();
            }
            Arrays.sort(costs);
            System.out.println(solution(costs));
        }
    }
    private static int solution(int[] costs) {
        // 每次过最慢的两个人,两种方案:
        // 最快、次快、再次快->  最快、次快<-  最快、最慢、次慢-> 最快、再次快<-   2个人  2 1 n-1 2
        // 最快、次快、最慢->    最快、次快<-  最快、次快、次慢-> 最快、次快<-     2个人 n-1 1 n-2 1

        int i = costs.length;
        for (; i > 4 ; i-=2) {
            int solution1 = 2 * costs[2] + costs[1] + costs[i - 1];
            int solution2 = 2 * costs[1] + costs[i- 1] + costs[i - 2];
            if (solution1 > solution2) {
                sum += solution2;
            } else {
                sum += solution1;
            }
        }
        if (i == 4) {
            // 最快、最慢、次慢->  最快、次快  3 1 2
            sum += (costs[1] + costs[2] + costs[3]);
        } else if (i == 3) {
            sum += costs[2];
        } else {
            //
        }
        return sum;
    }
}
#字节跳动##笔试题目##春招#
全部评论
话说我没有做到第五题,能讲一下第五题是啥吗?
点赞 回复 分享
发布于 2019-04-18 19:20
第一种: 最简单的就是三人去, 最小的两人回。 第二种: 每一次运两个人过去。ABC去AB回, ADE去AC回再ABC过去。 话说一种情况你们考虑到没有 7 1 2 3 4 1001 1002 1003 把这六个人看成A - G. 显然可以通过 EFG 一次过去省时间。 则顺序是 ABC去AB回ABD去AB回。 然后EFG去AD回,最后再把ABCD四人运过去。 
点赞 回复 分享
发布于 2019-04-14 13:58
我这个过了11%然后提示答案错误 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; import java.util.PriorityQueue; public class z5 {     static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));     static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));     static int nextInt() throws IOException {         in.nextToken();         return (int) in.nval;     }     static String next() throws IOException {         in.nextToken();         return (String) in.sval;     }     public static void main(String[] args) throws IOException {         int n = nextInt();         while (n-- != 0) {             int nn = nextInt();             int num[] = new int[nn + 1];             PriorityQueue<Integer> q1 = new PriorityQueue<>();             PriorityQueue<Integer> q2 = new PriorityQueue<>();             for (int i = 1; i <= nn; i++) {                 num[i] = nextInt();                 q1.add(num[i]);                 q2.add(-num[i]);             }             q1.poll();             int second = q1.poll(); // 次短时间             long s = 0;             while (q2.size() > 3) {                 s -= q2.poll(); // 渡河过去、 最长时间的人                 s += second; // 开回去             }             s -= q2.peek();             System.out.println(s);         }     } }
点赞 回复 分享
发布于 2019-04-14 12:56
我是这样想的,条件要求至少两人乘船,最多三人乘船。我于是把它分为2种情况(m为当前测试数的长度): 1、当m=2 or m = 3时 :     可以一次性过河,因此最少时间为其测试数的最大值 2、m >= 4 时:     先将最小的两个数拿出来,然后剩余 res =  m - 2人,接着最小的两个人就依次将剩下的res个人送至河对岸。因为每次送一次这两个人都要回来,回来的时间应该取这两人的最大值。不过要注意的是:当送完最后一人,就不需要回来了。         所以最短时间应该为:            剩下人数(即res个)数值相加的总值  +  res * t  ( t为最小两个数的最大数) ###3不懂对不对,反正我没有写完 :| ),不过测试几组还行,请大佬们纠正 n = int(input()) content = [] for i in range(0,n):     m = int(input())     a = input().split( )          for j in range(0,m):         a[j] = int(a[j])              a.sort() #排序     if m == 2:         content.append(a[1])     elif m == 3:         content.append(a[2])     else:                  res = m-2         two = res -1         t = two*a[1]         ss = sum(a[2:])         t = t+ss         content.append(t)          for k in content:     print(k)             
点赞 回复 分享
发布于 2019-04-14 12:51
是不是最多三人船二人返回的应该从5人开始分析啊?
点赞 回复 分享
发布于 2019-04-14 12:48
提示超时...11.11%
点赞 回复 分享
发布于 2019-04-14 12:20
要走三趟:去两趟 回来一趟,每趟保证至少两人坐船去较大值加进结果
点赞 回复 分享
发布于 2019-04-14 12:19
1次过1人和1次过两人比较简单  ABC去 AB回 ABD去 这算是一个人 ABC去 AB回 ADE去 AC回 这算是两个人 显然有三个人的情况 类似ABC去AB回 ABD去AB回 EFG去AD回
点赞 回复 分享
发布于 2019-04-14 12:19
我也是这种解法 通过率0。。。。
点赞 回复 分享
发布于 2019-04-14 12:18
我题目都没有看懂,4个人:1,1,1,1为什么是3啊😂,能不能解读一下
点赞 回复 分享
发布于 2019-04-14 12:17
我也差不多这样 不过想死以前有道过河问题要用dp
点赞 回复 分享
发布于 2019-04-14 12:17
船过去了是不是得考虑回来的?
点赞 回复 分享
发布于 2019-04-14 12:16

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务