freee Programming Contest 2022(AtCoder Beginner Contest 264)A~D题详细讲解

目录

博主赛情

网站链接

题目讲解 

A - "atcoder".substr()

原题描述

题目大意

题目思路

题目代码

相关知识

B - Nice Grid

原题描述

题目大意

题目思路

题目代码

相关知识

C - Matrix Reducing

原题描述

题目大意

题目思路

题目代码

相关知识

D - "redocta".swap(i,i+1)

原题描述

题目大意 

题目思路

题目代码

相关知识

比赛总结


博主赛情

从244起,博主一直坚持打ABC,今天终于上千分了,特此纪念!(码龄仅一岁,勿喷!)

freee Programming Contest 2022(AtCoder Beginner Contest 264)A~D题详细讲解_第1张图片

网站链接

freee Programming Contest 2022(AtCoder Beginner Contest 264) - AtCoder

freee Programming Contest 2022(AtCoder Beginner Contest 264)A~D题详细讲解_第2张图片

Task Score
A 100
B 200
C 300
D 400
E 500
F 500
G 600
Ex 600

题目讲解 

A - "atcoder".substr()

原题描述

freee Programming Contest 2022(AtCoder Beginner Contest 264)A~D题详细讲解_第3张图片

题目大意

打印字符串“atcoder”中的第l位到第r位之间的字符。

题目思路

从l循环到r,输出每一位。

题目代码

C++ (GCC 9.2.1) 100 1375 Byte AC 5 ms 3624 KB Detail
#include 
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<

相关知识

① string是C++、java、VB等编程语言中的字符串,字符串是一个特殊的对象,属于引用类型。 在java、C#中,String类对象创建后,字符串一旦初始化就不能更改,因为string类中所有字符串都是常量,数据是无法更改,由于string对象的不可变,所以可以共享。对String类的任何改变,都是返回一个新的String类对象。 C++标准库中string类以类型的形式对字符串进行封装,且包含了字符序列的处理操作。

② for循环是编程语言中一种循环语句,而循环语句由循环体及循环的判定条件两部分组成,其表达式为:for(单次表达式;条件表达式;末尾循环体){中间循环体;}。

B - Nice Grid

原题描述

freee Programming Contest 2022(AtCoder Beginner Contest 264)A~D题详细讲解_第4张图片

题目大意

输出下图中第r行第c列的颜色(black或white)。

freee Programming Contest 2022(AtCoder Beginner Contest 264)A~D题详细讲解_第5张图片

题目思路

方法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 
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 
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

原题描述

freee Programming Contest 2022(AtCoder Beginner Contest 264)A~D题详细讲解_第6张图片

freee Programming Contest 2022(AtCoder Beginner Contest 264)A~D题详细讲解_第7张图片

题目大意

你有两个矩阵:矩阵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 
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<

ps:博主不小心把w1和w2全写成r1和r2了……

相关知识

① 数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 这些有序排列的同类数据元素的集合称为数组。数组是用于储存多个相同类型数据的集合。

② break语句,是中断当前循环,或和label一起使用,中断相关联的语句。

D - "redocta".swap(i,i+1)

原题描述

freee Programming Contest 2022(AtCoder Beginner Contest 264)A~D题详细讲解_第8张图片

题目大意 

字符串s是“atcoder”的一种排列,交换相邻两字符的位置是一种操作,求至少需要多少次操作可以让s变成“atcoder”。

题目思路

不需要贪心算法,只要按顺序把每个字母归位就是最少操作。

题目代码

C++ (GCC 9.2.1) 400 2161 Byte AC 8 ms 3616 KB Detail
#include 
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<

相关知识

① swap函数是计算机中的函数,在不同领域有不同的用法,但都是交换的意思。

比赛总结

这次比赛取得新的进步,博主挺满意的,下次向E题迈进,继续努力!

你可能感兴趣的:(AtCoder,c++,算法)