atcodeABC264场

A - “atcoder”.substr()A - “atcoder”.substr()

Problem Statement
Print the L-th through R-th characters of the string atcoder.

在这里插入图片描述

题目大意

给定字符串"atcoder",要求输出字符串中第L到第R个字符的子串。

思路分析

题目要求输出指定位置范围内的子串。可以根据给定的L和R索引,从字符串中提取出对应的子串。
读取输入的L和R。
从给定的字符串"atcoder"中提取第L到第R个字符的子串,并将其保存在一个新的字符串中。
输出得到的子串。

知识点

substr是C++中的一个字符串操作函数,用于提取子串。

它的函数原型如下:

string substr (size_t pos, size_t len = npos) const;

pos参数表示要提取子串的起始位置(索引从0开始)。
len参数表示要提取的子串的长度。默认值为npos,表示提取从起始位置到字符串末尾的所有字符。
该函数返回一个新的字符串,包含了从指定位置开始的指定长度的子串。

时间复杂度

O(1)

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
int l,r;
cin>>l>>r;
string str="atcoder";
string res=str.substr(l-1,r-l+1);
cout<<res<<endl;
return 0;
}

B - Nice GridB - Nice Grid

在这里插入图片描述在这里插入图片描述

题目大意

给定一个15×15的网格,其中心方块位于第8行和第8列。根据给定的行号R和列号C,如果方块到中心方块的Chebyshev距离为奇数,则该方块涂黑;如果是偶数,则涂白。

思路分析

由于网格相对于中心方块(第8行和第8列)是对称和规则的。在给定的网格中,如果与中心方块的“距离”是奇数,则将该方块涂黑;如果是偶数,则涂白。具体而言,当且仅当从中心方块到第R行和第C列的方块的切比雪夫距离(棋盘距离)。max{∣R−8∣,∣C−8∣},(1)为奇数时,该方块为黑色。(此处,∣x∣表示x的绝对值。)

时间复杂度

O(1)

代码

#include <iostream>
using namespace std;

int main(void)
{
  int r, c;
  cin >> r >> c;
  
  if(max(abs(r-8), abs(c-8)) % 2) cout << "black" << endl;
  else cout << "white" << endl;
  
  return 0;
} 

C - Matrix ReducingC - Matrix Reducing

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目大意

给定两个矩阵A和B,可以对矩阵A进行任意次数的操作:选择一行或者一列并删除。判断是否能通过这些操作,使得矩阵A等于矩阵B.

思路分析

通过将第一个数组的子集映射到第二个数组来判断。
枚举所有的删除行和列的方式,即通过二进制位掩码来表示是否删除某一行或某一列。
对于每种删除行和列的方式,判断剩下的部分矩阵是否与矩阵 B 相等。

时间复杂度

O(2(H1+W1) * H1 * W1)

代码

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

int main(void)
{
  int h1, h2, w1, w2;
  int a[15][15], b[15][15];
  
  cin >> h1 >> w1; 
  for(int i = 1; i <= h1; i++) 
    for(int j = 1; j <= w1; j++) 
      cin >> a[i][j]; 
  
  cin >> h2 >> w2; 
  for(int i = 1; i <= h2; i++) 
    for(int j = 1; j <= w2; j++) 
      cin >> b[i][j]; 

  // 使用位运算枚举第一个数组的子集映射的可能性
  for(int i = 0; i < (1<<h1); i++){
    for(int j = 0; j < (1<<w1); j++){
      vector<int> hvec, wvec;
      
      // 将第i个二进制位为0的行添加到hvec中
      for(int k = 1; k <= h1; k++) 
        if((i & (1<<(k-1))) == 0) 
          hvec.push_back(k);
      
      // 将第j个二进制位为0的列添加到wvec中
      for(int k = 1; k <= w1; k++) 
        if((j & (1<<(k-1))) == 0) 
          wvec.push_back(k);
      
      // 如果选择的行列数与第二个数组的行列数不匹配,则继续下一次循环
      if(hvec.size() != h2 || wvec.size() != w2) 
        continue;
     
      bool match = true;
      // 比较映射后的两个数组是否相等
      for(int k = 1; k <= h2; k++){
        for(int l = 1; l <= w2; l++){
          if(a[hvec[k-1]][wvec[l-1]] != b[k][l]){
            match = false;
            break;
          }
        }
      }

      // 如果映射后的两个数组相等,则输出"Yes"并返回
      if(match){
        cout << "Yes" << endl;
        return 0;
      }
       
    }
  }
  
  // 如果所有情况都不匹配,则输出"No"
  cout << "No" << endl;

  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值