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;
}