IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【编程练习】小强去春游 -> 正文阅读

[数据结构与算法]【编程练习】小强去春游

题目来源:牛客,阿里巴巴编程题(2星),第3题

题目描述

在这里插入图片描述
在这里插入图片描述
从样例就可以看出,在选择由谁往回划的时候有两种选择方法。
对样例1([2,10,12,11])来说,每次都由最轻的人往回划,这种方法是最省时的;
对样例2([2,3,7,8])来说,如果每次都由最轻的人往回划,这种方法的耗时为22,而样例2给的答案是19。

这时需要转换思路,先搞清楚19是怎么来的:
令time=0;
第一次“往”:2和3一起,time+=3;
第一次“返”:2独自回来,time+=2;
第二次“往”:7和8一起,time+=8;
第二次“返”:3独自回来,time+=3;
第三次“往”:2和3一起,time+=3;
结束,总耗时time=3+2+8+3+3=19。

假设我们从河流左岸出发是“往”,从河流右岸回来是“返”。
至此,我们需要判断什么时候由左岸最轻者“返”,什么时候需要由右岸最轻者“返”。

题解

法一:超时的方法
我在判断由谁负责“返”时,采用了模拟的方法,会不断产生insert和pop的操作,所以超时了,代码如下:
【每一段错误的代码也有被记住的权利-----来自菜狗的卑微】
称“由左岸最轻者“返””的方法为法1,称“由右岸最轻者“返””的方法为法2。
以一次往返为单位,比较两种方法的耗时time和收益gain(即对面增加的重量),由此判断方法选择。
很显然,这样很慢。

def main():
    T = int(input())
    for i in range(T):
        n = int(input())
        left = [int(ni) for ni in input().split()]
        left.sort()
        if n==1:
            print(left[0])
            continue
        elif n==2:
            print(left[1])
            continue
        ans,right = left[0]+left[1],[left.pop(1)]
        while len(left)>2:
            minleft = left[0]
            maxleft = left[-1]
            time1 = maxleft+minleft
            gain1 = maxleft
            midleft = left[-2]
            minright = right[0]
            time2 = maxleft+minright
            gain2 = maxleft+midleft-minright
            if gain1-gain2>time1-time2:
                ans+=time1
                left.pop()
                right.append(maxleft)
            else:
                ans+=time2
                left.pop()
                left.pop()
                right.append(midleft)
                right.append(maxleft)
                left.insert(1,minright)
        ans += left[-1]
        print(ans)
    return

if __name__=='__main__':
    main()

法二:正解
以“两次来回”为单位,比较两种方法的耗时。
当左岸人数小于等于3时,则无须考虑方法选择。

def main():
    T = int(input())
    for i in range(T):
        left,ans = int(input()),0
        nums = [int(ni) for ni in input().split()]
        nums.sort()
        while left>0:
            if left==1:
                ans+=nums[0]
                left=0
            elif left==2:
                ans+=nums[1]
                left=0
            elif left==3:
                ans+=sum(nums[:3])
                left=0
            else:
                t1 = nums[0]*2+nums[left-1]+nums[left-2]
                t2 = nums[0]+nums[1]*2+nums[left-1]
                ans+=min(t1,t2)
                left-=2
        print(ans)
    return

if __name__=='__main__':
    main()

总结:

解题思路上,太乱【每日一emo】

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章           查看所有文章
加:2022-04-04 12:36:03  更:2022-04-04 12:40:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:34:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码