首页 > 其他分享 >2023.6.15每日一题

2023.6.15每日一题

时间:2023-06-15 23:12:38浏览次数:65  
标签:15 r1 r2 min int LL 2023.6 关卡 每日

原题链接:

A - Codeforces Round 666 (Div. 1) - C

B - Educational Codeforces Round 82 (Rated for Div. 2) - C

A. Monster Invaders - 2300

题目大意

在一款RPG当中,有两种类型的怪物,普通怪物血量为 \(1\),boss的血量为 \(2\)。

我们有三种攻击手段:

  • 手枪,对一个怪物造成1点伤害,装填时间为r1。

  • 激光枪,对当前关卡中的所有怪物(包括boss)造成1点伤害,装填时间为r2。

  • AWP,即刻击杀任何怪物,装填时间为r3。

枪支初始时未装填,一次只能装填一把枪。
如果对boss造成伤害但是没能打死boss,我们就必须移动到隔壁的关卡,其他时刻可以自选是否移动到隔壁的关卡,每次移动时间为 \(d\),移动过程中不可以攻击或换弹。

问通关游戏的最短时间为多少。

解题思路

传统dp

我们首先确定基准时间啊,也就是从第一个关卡到最后一个关卡一定需要 \((n - 1)d\) 的传送时间。

我们dp数组,直接存放通前 \(i\) 关的最短用时。

如果我们想要不换关卡clear一关的话,只能通过先拿手枪干掉所有小怪,再一发AWP击杀boss,这里的用时先存到clear数组中。

我们考虑转移,最基础的情况就是从上一关过来不换关卡花掉 clear 的时间,另外的转移方式是打通了上上关,在打上一关时使用激光枪或者打到剩下boss再开一枪手枪,这样需要传送到这一关,然后这一关再次抉择使用激光枪或者打到剩下boss再开一枪手枪回到上一关。这样这两关需要的时间就是dp[i - 2] + min({c[i], r1 * (a[i] + 2), r1 + r2}) + min({c[i - 1], r1 * (a[i - 1] + 2), r1 + r2}) + 2 * d,除此之外,还有一种转移的方式,就是三个关卡一起考虑,方法同上。因为一个关卡只能跳到相邻两关所以最多只需要考虑到三个关卡同时打。

最后还需要处理一下后缀和的特殊情况,就是从某一关开始不去其他关卡了,全结果取min即可。

前后缀

除了如上dp之外,本题还可以通过前后缀dp来考虑。

我们分段dp从 \(1\) 到 \(i\) 和从 \(i\) 到 \(n\) 的最小时间,每次转移的考虑和上面类似不再赘述。最后的结果就是每种中间切换前后缀的间断点的情况取最小值。

AC Code

dp Code

#include <iostream>
#include <algorithm>
#include <cstring>
#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;
typedef long long LL;

const int N = 1e6 + 10;
const int MOD = 1e9 + 7;

LL a[N], c[N];
LL dp[N], s[N];

void solve() {
    LL n, r1, r2, r3, d;
    cin >> n >> r1 >> r2 >> r3 >> d;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
    }
    for (int i = 1; i <= n; ++i) {
        c[i] = a[i] * r1 + r3;
    }
    for (int i = 1; i <= n; ++i) {
        dp[i] = dp[i - 1] + c[i];
        dp[i] = min({dp[i], dp[i - 2] + min({c[i], r1 * (a[i] + 2), r1 + r2}) + min({c[i - 1], r1 * (a[i - 1] + 2), r1 + r2}) + 2 * d, dp[i - 3] + min({c[i], r1 * (a[i] + 2), r1 + r2}) + min({c[i - 1], r1 * (a[i - 1] + 2), r1 + r2}) + min({c[i - 2], r1 * (a[i - 2] + 2), r1 + r2}) + d * 4});
    }
    LL res = dp[n];
    s[n] = c[n];
    for (int i = n - 1; i >= 0; --i) {
        s[i] = min({c[i], r1 * (a[i] + 2), r1 + r2}) + s[i + 1];
    }
    for (int i = n; i >= 0; --i) {
        res = min(res, dp[i - 1] + s[i] + (n - i) * d);
    }
    cout << res + (n - 1) * d << endl;
}

signed main() {
    ios;
    int T = 1;
//    cin >> T;
    while (T--) {
        solve();
    }
}


prefix and suffix code

#include <iostream>
#include <algorithm>
#include <cstring>
#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;
typedef long long LL;

const int N = 1e6 + 10;
const int MOD = 1e9 + 7;

LL a[N];
LL pre[N], suf[N];

void solve() {
    LL n, r1, r2, r3, d;
    cin >> n >> r1 >> r2 >> r3 >> d;
    for (LL i = 1; i <= n; i ++) {
        cin >> a[i];
    }
    for (LL i = 1; i <= n; i ++) {
        pre[i] = pre[i - 1] + min(d + r3 + r1 * a[i], 3 * d + min(r1 + r2, r1 * (a[i] + 2)));
        if (i >= 2) {
            pre[i] = min(pre[i], pre[i - 2] + 4 * d + min(r1 + r2, r1 * (a[i] + 2)) + min(r1 + r2, r1 * (a[i - 1] + 2)));
        }
    }
    for (LL i = n; i >= 1; i --) {
        if (i == n) {
            suf[i] = min(r3 + r1 * a[i], 2 * d + min(r1 + r2, r1 * (a[i] + 2)));
        } else {
            suf[i] = suf[i + 1] + 2 * d + min(r1 + r2, r1 * (a[i] + 2));
        }
    }
    LL res = min(suf[1], pre[n] - d);
    for (int i = 1; i < n; i --) {
        res = min(pre[i] + suf[i + 1], res);
    }
    cout << res << endl;
}

signed main() {
    ios;
    int T = 1;
//    cin >> T;
    while (T--) {
        solve();
    }
}



B. Perfect Keyboard - 1600

题目大意

给定poly的密码,他希望密码每个相邻字符在线性键盘上也相邻。那么问能否有这样的键盘使得满足poly的要求,如果有,给出键盘布局。

解题思路

直接模拟这个过程即可,构造一个结果串,同时记录多少字符是有限制的,逐个输出即可。

AC Code

#include <iostream>
#include <algorithm>
#include <cstring>
#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;
typedef long long LL;

const int N = 4e5 + 10;
const int MOD = 1e9 + 7;

void solve() {
    vector<int> vis(28);
    string s, t = "#";
    cin >> s;
    vis[s[0] - 'a'] = true;
    t += s[0];
    t += "#";
    int pos = 1;
    for (int i = 1; i < s.length(); ++i) {
        if (s[i] == s[i - 1]) {
            cout << "NO" << endl;
            return;
        }
        if (t[pos + 1] == s[i]) {
            pos++;
        } else if (t[pos - 1] == s[i]) {
            pos--;
        } else if (vis[s[i] - 'a']) {
            cout << "NO" << endl;
            return;
        } else if (t[pos + 1] == '#') {
            t[pos++ + 1] = s[i];
            t += '#';
            vis[s[i] - 'a'] = true;
        } else if (t[pos - 1] == '#') {
            t[pos - 1] = s[i];
            t = "#" + t;
            vis[s[i] - 'a'] = true;
        } else 
            cout << "NO" << endl;
            return;
        }
    }
    cout << "YES" << endl;
    t = t.substr(1, t.length() - 2);
    for (int i = 0; i < 26; ++i) {
        if (!vis[i]) {
            t += char(i + 'a');
        }
    }
    cout << t << endl;
}

signed main() {
    ios;
    int T = 1;
    cin >> T;
    while (T--) {
        solve();
    }
}

标签:15,r1,r2,min,int,LL,2023.6,关卡,每日
From: https://www.cnblogs.com/SanCai-Newbie/p/17484456.html

相关文章

  • 2023-06-15:说一说Redis的Key和Value的数据结构组织?
    2023-06-15:说一说Redis的Key和Value的数据结构组织?答案2023-06-15:全局哈希表Redis使用哈希表作为保存键值对的数据结构,通过哈希函数将Key映射为哈希表中的一个索引位置,使得Key-Value可以在O(1)时间复杂度内被快速访问。在Redis中,哈希表是由多个哈希桶(也称为槽位/数组元素)组成......
  • 2023.6.15 07.数据库存储过程
    07.数据库存储过程存储过程MySQL存储过程是⼀组预编译的SQL语句,可以在MySQL数据库中定义和存储,并在需要时执⾏。存储过程可以接受参数、执⾏条件判断、循环、异常处理等操作,使得开发⼈员可以把⼀系列操作组合成⼀个可重复使⽤的单元,从⽽提⾼代码的复⽤性和可维护......
  • (2023.6.15)linux下can的调试工具交叉编译
    //源码包路径:https://public.pengutronix.de/software/libsocketcan/libsocketcan-0.0.11.tar.bz2https://public.pengutronix.de/software/socket-can/canutils/v4.0/canutils-4.0.6.tar.bz2//编译命令./configure--host=arm-linux-gnueabihf--prefix=/home/fangzeli/work/......
  • 2023-6-15 面试笔试复盘总结
    四川君迪能源后端笔试2023-6-15简答题:线程和进程的区别本质区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。包含关系:一个进程至少有一个线程,线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。资源开销:每个进程都有独立的地址空......
  • 欧奈儿行业 RPS 排名,一图览全貌 2023-06-15
    自动复盘2023-06-15k线图是最好的老师,点击详情图可以看到行业20日RPS的排名,最底下子图是行业rps走势线跟踪板块总结:成交额超过100亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个上级的归类,这样更能体现主流方向rps有时候比较滞后,但不少是欲......
  • C/C++《数据结构》课程设计指导书[2023-06-15]
    C/C++《数据结构》课程设计指导书[2023-06-15]《数据结构》课程设计指导书适用专业:计算机2022级编写人:李玉龙2023年5月《数据结构》课程设计指导书一、设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题;2.初步掌握软......
  • C/C++器材信息管理系统[2023-06-15]
    C/C++器材信息管理系统[2023-06-15]使用C++程序设计语言,完成一个项目,项目名为:器材信息管理系统,要实现的功能如下,且每项功能具有数据校对验证:1、实现新器材的录入,包括器材的名称、录入日期、购买价钱等信息;2、当有器材借用需求时,进行借用登记,主要流程为:查询器材数量,若库存数量大......
  • 深入理解ASEMI代理光宝LTV-152光耦的特性与应用
    编辑-Z光耦LTV-152是一种广泛应用于电子设备中的光电器件,它的主要功能是实现电路之间的隔离和信号传输。本文将深入探讨光耦LTV-152的特性和应用,帮助读者更好地理解和使用这种重要的电子元件。 一、光耦LTV-152的特性 1.高隔离电压:光耦LTV-152具有高达5000Vrms的隔离电压,......
  • 2023-06-15 css伪类before、after制作文字两边横线
    <divclass="box">测试</div>···.box{color:#ccc;text-align:center;position:relative;&::after{position:absolute;left:24rpx;top:52%;content:'';width:calc(50%......
  • 2023-06-15
    渐渐的网易的歌听着听着收费了渐渐的张江的电车坐着坐着拆了....时代的浪潮下每个人也许只是被迫的不断的适应社会的变化而已吧。 ......