目录
A - "atcoder".substr()
A - "atcoder".substr()https://atcoder.jp/contests/abc264/tasks/abc264_a
题目描述
输出atcoder中从第L位到第R位的子串(从第一位记起)
题目分析
非常水的一道题,用substr就能解决(人家题目标题就已经给出了答案)
题目代码
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
int l,r;
int main(){
cin>>l>>r;
string s="atcoder";
cout<<s.substr(l-1,r-l+1);
return 0;
}
//ACplease!!!
B - Nice Grid
B - Nice Gridhttps://atcoder.jp/contests/abc264/tasks/abc264_b
题目描述
如图,将一个15*15的二维矩阵用黑白两种颜色一圈圈间隔涂满,请你求出第R行第C列是哪种颜色
题目分析
这道题容易让人觉得要用数学解,但其实硬做完全可以。首先把整个矩阵按要求填充好,然后再输出即可
题目代码
#include<bits/stdc++.h>
#define n 15
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
int a[20][20];
int r,c;
int main(){
cin>>r>>c;
for(int i=1;i<=n/2;i+=2){
int l=i,r=n-i+1;
for(int j=l;j<=r;j++){
if(j==l||j==r){
for(int k=l;k<=r;k++){
a[j][k]=1;
}
}
else{
a[j][l]=a[j][r]=1;
}
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<a[i][j];
cout<<endl;
}
*/
if(a[r][c]==1)cout<<"black"<<endl;
else cout<<"white"<<endl;
return 0;
}
//ACplease!!!
C - Matrix Reducing
C - Matrix Reducinghttps://atcoder.jp/contests/abc264/tasks/abc264_c
题目描述
给你两个二维数组A和B,问你能否通过删除某一行或某一列的方式使得A变为B
题目分析
这道题其实只需简单模拟,删除不合法(即包含B数组所不包含的元素)的行或列,最后判断删除行列后A是否变为了B即可
题目代码
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
int h1,h2,w1,w2;
int a[15][15],b[15][15];
int h[15],w[15];
int main(){
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];
}
}
if(h1<h2||w1<w2){
cout<<"No"<<endl;
return 0;
}
for(int i=1,x=1;i<=h1;i++){
int l=1;
for(int j=1,k=b[x][1];j<=w1;j++){
if(w[j])continue;
if(a[i][j]==k){
k=b[x][++l];
}
}
if(l<=w2){
h[i]=1;
continue;
}
else{
int l=1;
for(int j=1,k=b[x][l];j<=w1;j++){
if(a[i][j]!=k){
w[j]=1;
}
else{
k=b[x][++l];
}
}
x++;
}
}
int x=1;
for(int i=1;i<=h1;i++){
if(h[i])continue;
for(int j=1,l=1;j<=w1;j++){
if(w[j])continue;
else{
if(a[i][j]!=b[x][l]){
cout<<"No"<<endl;
return 0;
}
else l++;
}
}
x++;
}
if(x<=h2)cout<<"No"<<endl;
else cout<<"Yes"<<endl;
return 0;
}
//ACplease!!!
D - "redocta".swap(i,i+1)
D - "redocta".swap(i,i+1)https://atcoder.jp/contests/abc264/tasks/abc264_d
题目描述
给你一个atcoder的排列,问你至少经过几次相邻元素交换才能使得这个排列变成atcoder
题目分析
这道题看起来有些棘手,其实只要掌握特定知识,在进行一些转化就能迎刃而解。首先我们可以把输入的字符串转成数组,也就是说每个字符在数组里对应着在atcoder中的索引,这样整个问题就转化为了至少经过几次相邻元素交换才能使得一个数组变为升序。显而易见的是,这个问题的答案等于于逆序对数的个数,也就是说有多少个数对不符合最终排序要求,只要算出逆序对数的个数,就能找到这道题的答案
题目代码
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a/(gcd(a,b))*b;}
string s,atcoder="atcoder";
map <char,int> mp;
vector <int> v;
int ans=0;
int main(){
for(int i=0;i<atcoder.size();i++)mp[atcoder[i]]=i;
cin>>s;
for(int i=0;i<s.size();i++){
v.push_back(mp[s[i]]);
}
for(int i=0;i<v.size();i++){
for(int j=i+1;j<v.size();j++){
if(v[i]>v[j])ans++;
}
}
cout<<ans<<endl;
return 0;
}
//ACplease!!!