当前位置: 首页 > news >正文

AtCoder Beginner Contest 267 (A~D)

A. Saturday

题意:

告诉你今天星期几,问距离周六还有几天。

思路:

直接输出即可。

代码如下:

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    string s;
    cin >> s;

    if (s == "Monday") cout << 5 << endl;
    if (s == "Tuesday") cout << 4 << endl;
    if (s == "Wednesday") cout << 3 << endl;
    if (s == "Thursday") cout << 2 << endl;
    if (s == "Friday") cout << 1 << endl;

    return 0;
}

B. Split?

题意:

有一个保龄球图,保龄球编号从 1 到 10,其分布如下图所示。

将图中两条虚线的每个部分称为一列。
在这里插入图片描述

给定一个长度为 10 的 01串,一一对应每个保龄球,其中 0 表示被击倒,1 表示未被击倒。

问给定的序列是否满足:

  • 第一个保龄球被击倒

  • 存在两列都有未被击倒的保龄球,并且中间存在一列,其中的保龄球全部被击倒。

满足输出 Yes ,不满足则输出 No .

思路:

先将字符转化为数字存放在 a[] 中,再进行判断:要满足题意,那么 1 号必须为 0 .

接下来逐个分析,要求至少有一列都为 0 ,且除了该列之外每一列都至少有一个 1 .

代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long 
using namespace std;

int main()
{
    string s;
    cin >> s;
    s = ' ' + s;

    int a[20];
    for (int i = 1; i <= 10; i++)
        a[i] = s[i] - '0';

    if (s[1] == '0'){
        int sum = 0;
        for (int i = 1; i <= 10; i++){
            sum += a[i];
        }
        if (sum == 0){
            cout << "No" << endl;
            return 0;
        }

        if (a[3] + a[9] == 0){
            cout << "Yes" << endl;
            return 0;
        }
        if (a[2] + a[8] == 0){
            cout << "Yes" << endl;
            return 0;
        }
        if (a[5] == 0){
            cout << "Yes" << endl;
            return 0;
        }
        if (a[7] == 1 && a[4] == 0){
            cout << "Yes" << endl;
            return 0;
        }
        if (a[10] == 1 && a[6] == 0){
            cout << "Yes" << endl;
            return 0;
        }

        cout << "No" << endl;
    }
    else puts("No");

    return 0;
}

C. Index × A (Continuous ver.)

题意:

给定一个长度为 n 的数组 A,要求找到一段长度为 m 的连续子序列 B,使得 B 中每个数与其序号的乘积之和最大,输出最大值。

思路:

很容易想到用双指针来做,维护一个长度为 m 的滑动窗口,每次移动,都是将后一个数加入并将第一个数移出,还要重新计算当前窗口内的数值,如果每次都这样操作一遍的话,很容易时间复杂度过高导致超时。

我们发现每次移动前面都减少了一个从 lr 的区间和,由此想到可以用一个前缀和数组来维护区间和。

代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long 
using namespace std;
const int N = 2e5 + 10;

ll a[N];
ll s[N];

int main()
{
    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= n; i++){
        cin >> a[i];
        s[i] = s[i - 1] + a[i]; //前缀和
    }

    ll res = 0;
    for (int i = 1; i <= m; i++) //初始窗口,前m个数
        res += a[i] * i;

    //双指针
    ll ans = res;
    for (int i = m + 1; i <= n; i++){
        int l = i - m + 1, r = i;
        res += m * a[r] - (s[r - 1] - s[l - 2]);
        ans = max(ans, res);
    }

    cout << ans << endl;

    return 0;
}

D.Index × A (Not Continuous ver.)

题意:

与上题类似,只不过将连续子序列改成了子序列(可以不连续)。

给定一个长度为 n 的数组 A,要求找到一段长度为 m 的子序列 B,使得 B 中每个数与其序号的乘积之和最大,输出最大值。

思路:

n 的范围较大,考虑使用 dp 来做。

定义 f[i][j] 表示前 i 个数中选了 j 个数。

得到状态转移方程为:f[i][j] = max(f[i - 1][j - 1] + a[i] * j, f[i - 1][j]) .

代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 2010;

int a[N];
ll f[N][N]; //表示前i个数选了j个数

int main()
{
    int n, m;
    cin >> n >> m;

    memset(f, -0x3f, sizeof(f));
    
    for (int i = 1; i <= n; i++){
        cin >> a[i];
        f[i][0] = 0;
    }

    f[0][0] = 0; //初始化
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= m && j <= i; j++){
            f[i][j] = max(f[i - 1][j - 1] + a[i] * j, f[i - 1][j]);
        }
    }

    cout << f[n][m] << endl;

    return 0;
}

相关文章:

  • 羊了个羊游戏源码搭建开发过程
  • 基于人工蜂群算法的新型概率密度模型无人机路径规划(Matlab代码实现)
  • File Inclusion 全级别
  • 微信小程序——云开发|计费方式调整大家怎么看?
  • Github 最新霸榜,号称架构师修炼之路的“葵花宝典”限时开源
  • RFSoC应用笔记 - RF数据转换器 -07- RFSoC关键配置之RF-DAC内部解析(一)
  • 【老生谈算法】matlab实现霍夫变换算法源码——霍夫变换算法
  • 赶紧进来看看!!!你一定要会做的八道经典指针笔试题!!!
  • 力扣刷题流程--记录用
  • bp神经网络优化算法对比,bp神经网络的优化算法
  • 新学期,新FLAG | 从心出发
  • 数学建模国赛B题 完整思路与代码分享 无人机遂行编队飞行中的纯方位无源定位
  • 基于C语言实现了PASCAL编译器
  • 2022高教社杯数学建模国赛C题思路代码实现
  • [acwing周赛复盘] 第 69 场周赛20220917
  • (三)从jvm层面了解线程的启动和停止
  • Docker下部署自己的LNMP工作环境
  • DOM的那些事
  • Invalidate和postInvalidate的区别
  • Java 多线程编程之:notify 和 wait 用法
  • Javascript设计模式学习之Observer(观察者)模式
  • JS专题之继承
  • Mysql数据库的条件查询语句
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • React组件设计模式(一)
  • Vim Clutch | 面向脚踏板编程……
  • 给初学者:JavaScript 中数组操作注意点
  • 后端_MYSQL
  • 马上搞懂 GeoJSON
  • 移动端解决方案学习记录
  • 《码出高效》学习笔记与书中错误记录
  • Hibernate主键生成策略及选择
  • #define,static,const,三种常量的区别
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (JS基础)String 类型
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一) springboot详细介绍
  • .net core 控制台应用程序读取配置文件app.config
  • .Net Redis的秒杀Dome和异步执行
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [20190401]关于semtimedop函数调用.txt
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [Android] Amazon 的 android 音视频开发文档
  • [Django 0-1] Core.Handlers 模块
  • [Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷
  • [Electron]ipcMain.on和ipcMain.handle的区别