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) - AtCoder

TaskScore
A100
B200
C300
D400
E500
F500
G600
Ex600

题目讲解 

A - "atcoder".substr()

原题描述

题目大意

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

题目思路

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

题目代码

C++ (GCC 9.2.1)1001375 ByteAC5 ms3624 KBDetail
#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++、javaVB等编程语言中的字符串,字符串是一个特殊的对象,属于引用类型。 在javaC#中,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)2001392 ByteAC5 ms3664 KBDetail
#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)2001640 ByteAC8 ms3644 KBDetail
#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)3003105 ByteAC5 ms3616 KBDetail
#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)4002161 ByteAC8 ms3616 KBDetail
#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题迈进,继续努力!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中的代码是一个C语言程序,其中的`free(p)`是用来释放动态分配的内存空间的函数调用。在C语言中,当我们使用`malloc`或`calloc`函数动态分配内存空间后,需要在使用完毕后调用`free`函数来释放这块内存空间,以便让操作系统可以重新利用这块内存。`free(p)`的作用是释放指针`p`所指向的内存空间。\[1\] 在这个例子中,`freee`函数是自定义的函数,它接受一个指向字符的指针`p`作为参数,然后调用了`free(p)`来释放这块内存空间。这样做是为了避免内存泄漏,即在程序运行过程中不再需要使用的内存没有被释放,导致内存资源的浪费。\[1\] #### 引用[.reference_title] - *1* [习 8.19(2)写一函数free,将前面用new函数占用的...free(p)表示将p(地址)指向的单元以后的内存段释放。](https://blog.csdn.net/navicheung/article/details/80896880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C++ lock-free 和 wait-free 基本概念与相关知识点](https://blog.csdn.net/misayaaaaa/article/details/100063319)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值