25届-8.15联想(改编题) - 前端

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历

👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸

✨ 合集传送们 -> 🧷学长刷题笔记

🍒 本专栏已收集 140+ 套题 🍄 题面描述等均已改编,如果和你实际看到的题面描述不一样请理解,做法和题目本质基本不变。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞

alt

1️⃣ 第一题有点坑,注意模数是

2️⃣ 第二题是一道常见的类型的动态规划,不难

🥠 01.神奇果园的采摘策略

问题描述

LYA 正在经营一个神奇的果园。这个果园里共有 棵神奇的果树,编号从 。其中编号为 的果树初始结有 个果实,且保证 。每天,LYA 需要选择其中一棵还有果实的树进行采摘,她会将该树上所有果实都采摘下来,使得该树上果实数量归零。

有趣的是,每次采摘完成后,其他所有果树会受到魔法影响,立即使得它们树上的果实数量翻倍。LYA 想要以最优方式采摘,使得最后能收集到的果实数量最多。

采摘过程从第 1 天开始,第 棵树上初始有 个果实。LYA 每天选择一棵非空果树采摘,然后其余果树的果实数翻倍,如此循环直到第 天采摘完最后一棵非空果树。

请你帮助 LYA 找到最优的采摘方案,使得她能收集到最多的果实。

输入格式

第一行一个整数 ,表示果树数量。

第二行 个整数 表示编号为 的果树初始果实数量。

输出格式

输出一个整数表示答案。因为结果可能较大,请输出结果模 的余数。

tips ⚠️ 模数是

样例输入

2
1 2

样例输出

5

数据范围

对于 的数据,

题解

从小到大排序后贪心

我们按照果实数量从小到大的顺序采摘果树,

  1. 从果实数量最少的树开始采摘,每次采摘后,剩余树的果实数量翻倍,用一个变量记录当前翻倍了多少。
  2. 累加每次采摘的果实数量,注意要对大数进行取模操作。

时间复杂度为 ,主要来自排序。空间复杂度为 ,用于存储果树数组。

参考代码

  • Python
# 读取输入
n = int(input())
trees = list(map(int, input().split()))

# 对果树按果实数量排序
trees.sort()

MOD = 100000007
result = 0
multiplier = 1

# 遍历排序后的果树,计算总果实数
for fruits in trees:
    result = (result + fruits * multiplier) % MOD
    multiplier = (multiplier * 2) % MOD

# 输出结果
print(result)
  • Java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        // 读取输入
        int n = sc.nextInt();
        long[] trees = new long[n];
        for (int i = 0; i < n; i++) {
            trees[i] = sc.nextLong();
        }
        
        // 对果树按果实数量排序
        Arrays.sort(trees);
        
        long MOD = 1000000007;
        long result = 0;
        long multiplier = 1;
        
        // 遍历排序后的果树,计算总果实数
        for (long fruits : trees) {
            result = (result + fruits * multiplier % MOD) % MOD;
            multiplier = (multiplier * 2) % MOD;
        }
        
        // 输出结果
        System.out.println(result);
        sc.close();
    }
}
  • Cpp
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;
    
    // 读取输入
    vector<long long> trees(n);
    for (int i = 0; i < n; i++) {
        cin >> trees[i];
    }
    
    // 对果树按果实数量排序
    sort(trees.begin(), trees.end());
    
    const long long MOD = 1000000007;
    long long result = 0;
    long long multiplier = 1;
    
    // 遍历排序后的果树,计算总果实数
    for (long long fruits : trees) {
        result = (result + fruits * multiplier % MOD) % MOD;
        multiplier = (multiplier * 2) % MOD;
    }
    
    // 输出结果
    cout << result << endl;
    
    return 0;
}

🍡 02.LYA的精品购物计划

问题描述

LYA 是一位知名时尚博主,她计划在一家新开的精品店购买一系列商品来制作视频。这家店有 件商品,从左到右排列,编号为 。LYA 决定从左往右选购,不能跳过中间的商品再回头购买。每件商品最多只能买一个。

对于第 件商品,LYA 给它评定了一个基础吸引力值 。但是,LYA 发现购买顺序会影响她的购物体验。她认为第 个购买的商品会给她带来 倍的额外体验加成。如果第 个购买的是商品 ,那么这件商品带给 LYA 的总体验值就是

LYA 计划购买 件商品,她希望你能帮她制定一个购买方案,使得她能获得最大的总体验值。

输入格式

第一行包含两个整数 ,分别表示商品总数和计划购买的商品数。

第二行包含 个整数 ,其中 表示编号为 的商品的基础吸引力值。

第三行包含 个整数 ,其中 表示第 个购买的商品的体验加成倍率。

输出格式

输出一个整数,表示 LYA 能获得的最大总体验值。

样例输入

3 2
1 2 3
5 1

样例输出

13

数据范围

对于 100% 的数据,满足:

题解

本题

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏短期内不再更新,请勿继续订阅

全部评论

相关推荐

评论
3
14
分享

创作者周榜

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