目录
博主赛情
从244起,博主一直坚持打ABC,今天终于上千分了,特此纪念!(码龄仅一岁,勿喷!)
网站链接
freee Programming Contest 2022(AtCoder Beginner Contest 264) - AtCoder
Task | Score |
---|---|
A | 100 |
B | 200 |
C | 300 |
D | 400 |
E | 500 |
F | 500 |
G | 600 |
Ex | 600 |
题目讲解
A - "atcoder".substr()
原题描述
题目大意
打印字符串“atcoder”中的第l位到第r位之间的字符。
题目思路
从l循环到r,输出每一位。
题目代码
C++ (GCC 9.2.1) 100 1375 Byte AC 5 ms 3624 KB Detail #include<bits/stdc++.h> using namespace std; int main(){ cin.tie(0); ios::sync_with_stdio(0); string s="atcoder"; int l,r; cin>>l>>r; for(int i=l;i<=r;i++) cout<<s[i-1]; return 0; } //ACplease!!! /* printf(" \n"); printf(" \n"); printf(" * * * * * * * * * * * * \n"); printf(" * * * * * * * * \n"); printf(" * * * * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * * * * * * * * * * * * * * * * * * * * \n"); \n"); */
相关知识
① string是C++、java、VB等编程语言中的字符串,字符串是一个特殊的对象,属于引用类型。 在java、C#中,String类对象创建后,字符串一旦初始化就不能更改,因为string类中所有字符串都是常量,数据是无法更改,由于string对象的不可变,所以可以共享。对String类的任何改变,都是返回一个新的String类对象。 C++标准库中string类以类型的形式对字符串进行封装,且包含了字符序列的处理操作。
② for循环是编程语言中一种循环语句,而循环语句由循环体及循环的判定条件两部分组成,其表达式为:for(单次表达式;条件表达式;末尾循环体){中间循环体;}。
B - Nice Grid
原题描述
题目大意
输出下图中第r行第c列的颜色(black或white)。
题目思路
方法1:找规律发现,max(abs(r-8),abs(c-8))%2为1时是black,反之是white。
方法2:手写前8行,后面循环复制,第i行=第16-i行。
题目代码
方法1:
C++ (GCC 9.2.1) 200 1392 Byte AC 5 ms 3664 KB Detail #include<bits/stdc++.h> using namespace std; int main(){ cin.tie(0); ios::sync_with_stdio(0); int r,c; cin>>r>>c; if(max(abs(r-8),abs(c-8))%2) puts("black"); else puts("white"); return 0; } //ACplease!!! /* printf(" \n"); printf(" \n"); printf(" * * * * * * * * * * * * \n"); printf(" * * * * * * * * \n"); printf(" * * * * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * * * * * * * * * * * * * * * * * * * * \n"); \n"); */
方法2:
C++ (GCC 9.2.1) 200 1640 Byte AC 8 ms 3644 KB Detail #include<bits/stdc++.h> using namespace std; int main(){ cin.tie(0); ios::sync_with_stdio(0); string s[30]; s[1]="000000000000000"; s[2]="011111111111110"; s[3]="010000000000010"; s[4]="010111111111010"; s[5]="010100000001010"; s[6]="010101111101010"; s[7]="010101000101010"; s[8]="010101010101010"; for(int i=9;i<=15;i++) s[i]=s[16-i]; int r,c; cin>>r>>c; if(s[r][c-1]=='1') puts("white"); else puts("black"); return 0; } //ACplease!!! /* printf(" \n"); printf(" \n"); printf(" * * * * * * * * * * * * \n"); printf(" * * * * * * * * \n"); printf(" * * * * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * * * * * * * * * * * * * * * * * * * * \n"); \n"); */
相关知识
① 函数max函数用于求向量或者矩阵的最大元素,或几个指定值中的最大值。MATLAB等高级编程语言中常用有三种形式:max(A)、max(A,B)、max(A,[],dim)。
② puts()函数的功能是用于输出一个字符串,其中括号内的参数是输出字符串的起始地址。 用来向标准输出设备(屏幕)写字符串并换行, 其调用格式为: puts(s);
puts(s) 等效于printf("%s\n",s),前提 :s是C风格字符串,最后以'\0'结尾。
说明:(1). puts()函数只能输出字符串, 不能输出数值或进行格式变换。 (2). 可以将字符串直接写入puts()函数中。如: puts("Hello, Turbo C2.0");
③ abs 函数是存在于多种编程语言(包括且不限于:C语言、C++、Fortran、Matlab、Pascal、Delphi、Visual Basic 和 VBA)中的一种用于求数据绝对值的函数。
C - Matrix Reducing
原题描述
题目大意
你有两个矩阵:矩阵a(h1×w1),矩阵b(h2×w2)。问能否删除一些行列(可以不删除),将a变成b。
题目思路
遇到a的某行或列不包含任何b里的元素,则删除该行或列。数据很小,时间很充裕,可以乱写循环。
题目代码
C++ (GCC 9.2.1) 300 3105 Byte AC 5 ms 3616 KB Detail #include<bits/stdc++.h> using namespace std; int main(){ cin.tie(0); ios::sync_with_stdio(0); long long h1,r1,h2,r2,a[20][20],b[20][20]; cin>>h1>>r1; long long h1t=h1,r1t=r1; for(long long i=1;i<=h1;i++) for(long long j=1;j<=r1;j++) cin>>a[i][j]; cin>>h2>>r2; for(long long i=1;i<=h2;i++) for(long long j=1;j<=r2;j++) cin>>b[i][j]; for(long long i=1;i<=h1t;i++){ bool flag=1; for(long long j=1;j<=r1t;j++){ for(long long k=1;k<=h2;k++) for(long long l=1;l<=r2;l++) if(b[k][l]==a[i][j]){ flag=0; break; } if(!flag) break; } if(flag){ h1--; for(long long j=1;j<=r1;j++) a[i][j]=0; } } int y=0,z=1; for(long long i=1;i<=h1t;i++){ bool flag=0; for(long long j=1;j<=r1t;j++){ if(a[i][j]){ y++; a[z][y]=a[i][j]; flag=1; } } if(flag) z++; y=0; } h1t=h1; r1t=r1; //cout<<h1<<" "<<r1<<endl; for(long long i=1;i<=r1t;i++){ bool flag=1; for(long long j=1;j<=h1t;j++){ for(long long k=1;k<=h2;k++) for(long long l=1;l<=r2;l++) if(b[k][l]==a[j][i]){ flag=0; break; } if(!flag) break; } if(flag){ r1--; for(long long j=1;j<=h1;j++) a[j][i]=0; } } /*for(long long i=1;i<=h1t;i++){ for(long long j=1;j<=r1t;j++){ cout<<a[i][j]<<" "; } cout<<endl; } */ y=0,z=1; for(long long i=1;i<=h1t;i++){ bool flag=0; for(long long j=1;j<=r1t;j++){ if(a[i][j]){ y++; a[z][y]=a[i][j]; flag=1; } } if(flag) z++; y=0; } if(h1<h2||r1<r2) cout<<"No"; else{ /*for(long long i=1;i<=h1t;i++){ for(long long j=1;j<=r1t;j++){ cout<<a[i][j]<<" "; } cout<<endl; }*/ for(long long i=1;i<=h2;i++) for(long long j=1;j<=r2;j++) if(a[i][j]!=b[i][j]){ cout<<"No"; return 0; } cout<<"Yes"; } return 0; } //ACplease!!! /* printf(" \n"); printf(" \n"); printf(" * * * * * * * * * * * * \n"); printf(" * * * * * * * * \n"); printf(" * * * * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * * * * * * * * * * * * * * * * * * * * \n"); \n"); */
ps:博主不小心把w1和w2全写成r1和r2了……
相关知识
① 数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。数组是用于储存多个相同类型数据的集合。
② break语句,是中断当前循环,或和label一起使用,中断相关联的语句。
D - "redocta".swap(i,i+1)
原题描述
题目大意
字符串s是“atcoder”的一种排列,交换相邻两字符的位置是一种操作,求至少需要多少次操作可以让s变成“atcoder”。
题目思路
不需要贪心算法,只要按顺序把每个字母归位就是最少操作。
题目代码
C++ (GCC 9.2.1) 400 2161 Byte AC 8 ms 3616 KB Detail #include<bits/stdc++.h> using namespace std; int main(){ cin.tie(0); ios::sync_with_stdio(0); string s; cin>>s; int ans=0; for(int i=1;i<(int)s.size();i++){ if(s[i]=='a'){ for(int j=i;j>0;j--){ swap(s[j],s[j-1]); ans++; } } } for(int i=2;i<(int)s.size();i++){ if(s[i]=='t'){ for(int j=i;j>1;j--){ swap(s[j],s[j-1]); ans++; } } } for(int i=3;i<(int)s.size();i++){ if(s[i]=='c'){ for(int j=i;j>2;j--){ swap(s[j],s[j-1]); ans++; } } } for(int i=4;i<(int)s.size();i++){ if(s[i]=='o'){ for(int j=i;j>3;j--){ swap(s[j],s[j-1]); ans++; } } } for(int i=5;i<(int)s.size();i++){ if(s[i]=='d'){ for(int j=i;j>4;j--){ swap(s[j],s[j-1]); ans++; } } } if(s[5]=='r'){ swap(s[5],s[6]); ans++; } cout<<ans; return 0; } //ACplease!!! /* printf(" \n"); printf(" \n"); printf(" * * * * * * * * * * * * \n"); printf(" * * * * * * * * \n"); printf(" * * * * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * \n"); printf(" * * * * * * * * * * * * * * * * * * * * * * * * \n"); \n"); */
相关知识
① swap函数是计算机中的函数,在不同领域有不同的用法,但都是交换的意思。
比赛总结
这次比赛取得新的进步,博主挺满意的,下次向E题迈进,继续努力!