首页 > 其他分享 >CodeStar第七周周赛普及进阶组

CodeStar第七周周赛普及进阶组

时间:2022-11-21 21:00:41浏览次数:34  
标签:CodeStar 进阶 周周赛 rep int 珠子 dp 能量 leqslant

T1:四次方的和

给出 \(n\) 个正整数 \(a_1,~a_2,~\cdots,~a_n\)。选择其中总和不超过 \(m\) 的若干数,每个数只能选 \(1\) 次,选出的数的 \(4\) 次方之和最大是多少?

限制:

  • \(1 \leqslant n \leqslant 4000\)
  • \(1 \leqslant m \leqslant 10^4\)
  • \(1 \leqslant a_i \leqslant 10^4\)

算法分析

本题难度简单,01背包模板题。直接使用二维数组会爆内存,需要空间优化

\(a_i\):物品体积
\(a_i^4\):物品价值

dp[i][j] 表示从 \(a_1 \sim a_i\) 中选和不超过 \(j\) 的数可得到的最大 \(4\) 次方之和

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;

inline void chmax(ll& x, ll y) { if (x < y) x = y; }

int main() {
    int n, m;
    cin >> n >> m;
    
    vector<int> a(n);
    rep(i, n) cin >> a[i];
    
    vector<ll> dp(m+1);
    rep(i, n) {
        for (int j = m; j >= a[i]; --j) {
            ll x = (ll)a[i]*a[i]*a[i]*a[i];
            chmax(dp[j], dp[j-a[i]]+x);
        }
    }
    
    cout << dp[m] << '\n';
    
    return 0;
}

T2:能量珠

小猴乘坐火箭到了 Mars 星球上,Mars 星上有很多能量珠。
小猴找到了 \(n\) 个能量珠,第 \(i\) 个能量珠的大小为 \(a_i\)。两个能量珠通过连接,可以释放出能量,一个大小为 \(x\) 和一个大小为 \(y\) 的能量珠连接,可以释放出的能量为 \(x \times y\)。
小猴打算选取总大小不超过 \(m\) 的能量珠,把它们按照序号从小到大的顺序,依次连接在一起,求他能得到的最大能量。
例如,小猴选取大小为 \(1,2,5,10\) 的能量珠,他可以获得的能量为 \(1 \times 2 + 2\times 5 + 5\times 10 = 62\)。

限制:

  • \(1 \leqslant n \leqslant 100\)
  • \(1 \leqslant m \leqslant 5000\)
  • \(1 \leqslant a_i \leqslant 1000\)

算法分析

本题难度中等,类似最长上升子序列,区别是增加了一个总大小的限制。用两个维度分别记录最后拿出的珠子和珠子的总大小。状态转移时,枚举上一个珠子是什么。

dp[i][j] 表示从前 \(i\) 个珠子中选取总大小不超过 \(j\) 的珠子能得到的最大能量

转移:

取 \(a_i\)

dp[i][j] = dp[i-1][j-ai] + ai*ai上一个珠子的大小

但这里不知道 \(a_i\) 上一个珠子是什么,可以将这个信息加到 \(dp\) 定义中

想法:

dp[i][j]:以 \(a_i\) 结尾且总大小 \(\leqslant j\) 时能得到的最大能量

转移:

dp[i][j]:枚举 \(a_i\) 上一个珠子是什么

\( dp[i][j] = \max(dp[i][j], dp[k][j-a_i] + a_k \times a_i) \)

细节:

  • 当 \(a_i\) 没有上一个时,只有 \(1\) 个珠子,无法有能量,\(dp[i][j]\) 保留初值 \(0\),所以不用做多余操作
  • 上一个珠子能不能是 \(a_k\) ?以 \(a_k\) 结尾的珠子总大小是 \(j-a_i\),这要求 \(j-a_i\) 中至少有 \(a_k\) 的大小

答案:\(dp[1\sim n][m]\) 中的最大值

时间复杂度:\(O(n^2m)\)

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;

inline void chmax(int& x, int y) { if (x < y) x = y; }

int dp[105][5005];

int main() {
    int n, m;
    cin >> n >> m;
    
    vector<int> a(n);
    rep(i, n) cin >> a[i];
    
    rep(i, n)rep(j, m+1) {
        int now = 0;
        rep(k, i) if (j-a[i] >= a[k]) {
            chmax(now, dp[k][j-a[i]] + a[k]*a[i]);
        }
        dp[i][j] = now;
    }
    
    int ans = 0;
    rep(i, n) chmax(ans, dp[i][m]);
    
    cout << ans << '\n';
    
    return 0;
}

标签:CodeStar,进阶,周周赛,rep,int,珠子,dp,能量,leqslant
From: https://www.cnblogs.com/Melville/p/16913208.html

相关文章

  • 登录页进阶验证(进阶版)
    登录页在全局表单验证中获取ajax数据:200证明接口数据请求成功:数据请求成功后就可以利用状态码200:(登录成功:200)来存储用户信息,提示成功并跳转到首页捕获异常:效果:......
  • 面向对象进阶(多态&包&final&权限修饰符&代码块)
    ​ 多态:多态是java面向对象三大特性之一多态也就是一个对象的多种形态。前提【重点】        有继承或者实现关系        方法的重写【意义体现:不......
  • python函数进阶
    #1.函数的作用域#全局变量的作用域:#一般在函数体外定义的变量成为全局变量,在函数内部定义的变量称为局部变量。#全局变量所有作用域都可用,局部变量只能在本函数可......
  • MySQL进阶实战1,数据类型与三范式
    一、选择优化的数据类型MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。1、更小的一般情况下,应该尽量使用较小的数据类型,更小的数据类型通常更快,因为......
  • Python算法(进阶)
    1.01背包问题有若干物品,每个物品有对应的重量weight和价值value,背包容纳重量为bag_weight,在背包允许的重量下,往背包内放物品,每个物品只能放一次,保证其价值最高w......
  • 4. Vue 【进阶】- 模板引擎
    Vue【进阶】-模板引擎vue的源码学习流程和知识点分析本次您将学习到的东西前期准备1.简介1.1什么是模板引擎模板引擎是将数据要变为视图最优雅的解决方案1......
  • 5. Vue 【进阶】- AST 抽象语法树
    Vue【进阶】-AST抽象语法树1.AST简介在开发Vue的时候编译器会将模板语法编译成正常的HTML语法,而直接编译的时候是非常困难的,因此此时会借助AST抽象语法树进行周转,进......
  • 「进阶」缓解眼睛疲劳,防蓝光保护视力,关爱健康!- CareUEyes
    软件官网地址:https://care-eyes.com/显示对于显示页面来说8个模式下面都有对应的介绍说明,不再介绍。笔者建议软件调节之前,先退出软件,用系统自带的亮度调节,进入电源选......
  • 【C语言进阶】三.字符串函数
    (一)字符串函数1.strlen(计算字符串元素数)(1)用法size_tstrlen(constchar*str)字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包......
  • TypeScript 复习与进阶三部曲 (3) – TypeScript 类型体操
    前言在 第一部–把TypeScript当强类型语言使用 和 第二部– 把TypeScript当编程语言使用 后,我们几乎已经把TypeScript的招数学完了.第三部就要开始做练......