Codeforces Round #777 (Div. 2)(A-C)D待补

简介: 算法

A. Madoka and Math Dad


题意:

已知一个数字字符串构成的位数和为n的长度,求能构造出字典序最长的字符串,并且相邻的数字不能相等且不能含0


思路:

既然不能含0,那肯定是用最小的1和2去不断的构成,且字典序要最长,所以应该优先2121这种,但是如果长度是4,21之后还少1,那么明显211违法了要求,所以要121,就是反转再添加1

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,i,j,t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        int flag=0;
        string ss="";
        while(n>=2)
        {
            if(flag==0) {
                flag=1;
                n-=2;
                ss+="2";
            }
            else {
                flag=0;
                n--;
                ss+="1";
            }
        }
        if(n>=1&&flag==0)
        {
            reverse(ss.begin(),ss.end());
            ss+="1";
            reverse(ss.begin(),ss.end());
        }
        else if(n>=1&&flag==1)
        {
            ss+="1";
        }
        cout<<ss<<endl;
    }
    return 0;
}


B. Madoka and the Elegant Gift


题意:

没有被包含的矩阵叫nice矩阵,如果一个图标里的任意两个nice矩阵相交那就输出NO,否则输出yes


思路:

简单来说如果该矩阵没被包含,那么就可以理解为最大的矩阵,或者是突出来的矩阵就像这样,很明显第一行的蓝色框柱的矩阵没有被任何包裹,那么他就是个nice矩阵,而紫色同理也没被任何矩阵框柱,它也是nice矩阵,但是很明显,他们有交集,是相交的,所以其实就是去找整个图里没有矩阵具有突出的点,有就是no,代码的话,我就是去找1的位置,然后横着找到连续的设定为它的长,竖着找宽,然后判断矩阵外的一周有没有0,

9.png

#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
char m1[maxn][maxn];
bool vis[maxn][maxn];
int n,m;
bool check(int x,int y)
{
    int x1=x,y1=y,i,j,flag=0;
    for(i=x+1;i<n;i++)
    {
        if(m1[i][y]=='1')
            x1++;
        else
            break;
    }
    for(j=y+1;j<m;j++)
    {
        if(m1[x][j]=='1')
            y1++;
        else
            break;
    }
    for(i=x;i<=x1;i++)
    {
        for(j=y;j<=y1;j++)
        {
            vis[i][j]=1;
            if(m1[i][j]!='1')
                flag=1;
            if(i==x||i==x1||j==y||j==y1)
            {
                if(i==x)
                {
                    if(i-1>=0)
                    {
                        if(m1[i-1][j]=='1')
                            flag=1;
                    }
                }
                if(i==x1)
                {
                    if(i+1<n)
                    {
                        if(m1[i+1][j]=='1')
                            flag=1;
                    }
                }
                if(j==y)
                {
                    if(j-1>=0)
                    {
                        if(m1[i][j-1]=='1')
                            flag=1;
                    }
                }
                if(j==y1)
                {
                    if(j+1<m)
                    {
                        if(m1[i][j+1]=='1')
                            flag=1;
                    }
                }
            }
        }
    }
    if(flag==1) return false;
    return true;
}
int main()
{
    int i,j,t;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
                cin>>m1[i][j],vis[i][j]=0;
        }
        int f1=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(m1[i][j]=='1'&&vis[i][j]==0)
                {
                    if(!check(i,j)) f1=1;
                }
                if(f1==1) break;
            }
            if(f1==1) break;
        }
        if(f1==1)
        {
            cout<<"NO"<<endl;
        }
        else
        {
            cout<<"YES"<<endl;
        }
    }
    return 0;
}

C. Madoka and Childish Pranks


题意:

给你一个需要构成的图,黑色是1,白色是0,要求你操作n*m次之内从全是0的图得到目标图,操作是选择一个任意长度和宽度的矩阵,把左上角变成0,然后和0相邻的全是1,和1相邻的全是0,这样涂。


思路:

不难想到先从小的矩阵开始涂观察能否涂一个格子这样,我的思路是从最后一层最后一个开始涂起,如果当前位置应要黑色,就把位置涂黑,然后把上面的位置涂白,一直这样到第一层再从右边往左涂,涂到第一个就无法动了,所以只要第一个不是1,那么就有方案;  

10.png

#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
char m1[maxn][maxn];
bool vis[maxn][maxn];
int n,m;
bool check(int x,int y )
{
    if(x-1>=1&&m1[x-1][y]=='0')
        return true;
    if(y-1>=1&&m1[x][y-1]=='0')
        return true;
    return false;
}
int main()
{
    int i,j,t;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        vector<pair<int,int >>mo,ans;
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=m; j++)
            {
                cin>>m1[i][j];
            }
        }
        int flag=0;
        for(i=n;i>=1;i--)
        {
            for(j=m;j>=1;j--)
            {
                if(m1[i][j]=='1')
                {
                    if(i-1>=1)
                    {
                        ans.push_back({i-1,j});
                        ans.push_back({i,j});
                    }
                    else if(j-1>=1)
                    {
                        ans.push_back({i,j-1});
                        ans.push_back({i,j});
                    }
                    else
                    {
                        flag=1;
                    }
                }
            }
        }
        if(flag==1)
        {
            cout<<-1<<endl;
        }
        else
        {
            cout<<ans.size()/2<<endl;
            for(i=0;i<ans.size();i+=2)
            {
                cout<<ans[i].first<<" "<<ans[i].second<<" "<<ans[i+1].first<<" "<<ans[i+1].second<<endl;
            }
        }
    }
    return 0;
}




相关文章
|
7月前
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
333 0
|
5月前
|
机器学习/深度学习 算法 数据挖掘
PyTabKit:比sklearn更强大的表格数据机器学习框架
PyTabKit是一个专为表格数据设计的新兴机器学习框架,集成了RealMLP等先进深度学习技术与优化的GBDT超参数配置。相比传统Scikit-Learn,PyTabKit通过元级调优的默认参数设置,在无需复杂超参调整的情况下,显著提升中大型数据集的性能表现。其简化API设计、高效训练速度和多模型集成能力,使其成为企业决策与竞赛建模的理想工具。
173 12
PyTabKit:比sklearn更强大的表格数据机器学习框架
|
6月前
|
JSON 监控 API
1688商品列表API接口指南
1688 商品列表 API 可帮助开发者和商家获取商品基本信息(如 ID、名称、价格等)、支持筛选排序(类目、价格、销量等条件)、分页查询及指定店铺商品获取,便于商品管理与竞品分析。调用流程包括:注册账号创建应用以获取 App Key 和 App Secret、生成签名确保请求合法性、构造请求参数(含 app_key、sign 等)、发送 HTTP 请求并处理 JSON 响应数据。
257 19
|
10月前
|
算法 大数据 Linux
深入理解操作系统之进程调度算法
【10月更文挑战第24天】本文旨在通过浅显易懂的语言,带领读者深入了解操作系统中的进程调度算法。我们将从进程的基本概念出发,逐步解析进程调度的目的、重要性以及常见的几种调度算法。文章将通过比喻和实例,使复杂的技术内容变得生动有趣,帮助读者建立对操作系统进程调度机制的清晰认识。最后,我们还将探讨这些调度算法在现代操作系统中的应用和发展趋势。
|
SQL 关系型数据库 MySQL
深入探索MySQL索引策略
本文旨在深入探讨MySQL(8.0.26)数据库中索引的设计与优化方法。
|
SQL 关系型数据库 MySQL
MySQL删除表数据、清空表命令(truncate、drop、delete 区别)
MySQL删除表数据、清空表命令(truncate、drop、delete区别) 使用原则总结如下: 当你不需要该表时(删除数据和结构),用drop; 当你仍要保留该表、仅删除所有数据表内容时,用truncate; 当你要删除部分记录、且希望能回滚的话,用delete;
|
Prometheus 监控 数据可视化
面试分享:Airflow工作流调度系统架构与使用指南
【4月更文挑战第10天】Apache Airflow是关键的工作流调度系统,本文结合面试经验,深入探讨其核心架构和使用技巧。重点包括:1) Airflow的Scheduler、Web Server、Worker和Metadata Database组件;2) DAG、Task和Operator的概念;3) DAG编写、调度及错误处理策略;4) 监控与扩展性,如自定义Operator和最佳实践。通过学习,助你在面试中应对Airflow相关问题,并提升实际工作中的数据工程能力。
869 5
|
Web App开发 JSON JavaScript
Chrome 插件各模块之间的消息传递
Chrome 插件各模块之间的消息传递 一、消息传递 1. 消息传递分类 Chrome 插件的 Action、Background 和 content_script 三个模块之间的信息传输 插件和插件之间的信息传输 网页向插件进行信息传输 与原生应用进行消息传递
724 0
|
监控 前端开发 Java
SpringBoot与SpringMVC有哪些区别?
SpringBoot和SpringMVC是Java开发中常用的两个框架,它们都是由Spring框架所提供的,但在功能和使用方式上有着一些区别。
1240 2
|
存储 传感器 编解码
【Camera基础(二)】摄像头驱动原理和开发&&V4L2子系统驱动架构
【Camera基础(二)】摄像头驱动原理和开发&&V4L2子系统驱动架构