2023首届大学生算法大赛——测试赛题解

目录

A-B数对

 解题思路:

神奇的幻方

 解题思路:

字符统计

 解题思路:


A-B数对

题目描述

给出一串数以及一个数字 C,要求计算出所有 A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入

输入共两行。

第一行,两个整数 N,C。

第二行,N 个整数,作为要求处理的那串数。

输出

一行,表示该串数中包含的满足 A−B=C 的数对的个数。

样例输入

4 1
1 1 2 3

样例输出

3

提示

1 <= N <= 2000

 解题思路:

采用set集合记录每一个出现的数字,然后使用map记录数字出现的次数,那么最终的数对个数即为该出现的数字与该出现的数字+C形成的数字出现的次数的乘积

#include
using namespace std; 
mapmp;
sets;
int n,c,t,ans;
int main()
{	
	cin>>n>>c;
	for(int i=0;i>t;
		s.insert(t);
		mp[t]++;
	}
	for(auto i =s.begin();i!=s.end();i++)
	{
		ans+=mp[*i]*mp[(*i)+c];
	}	
	cout<

神奇的幻方

题目描述

幻方是一种很神奇的N*N矩阵:它由数字1,2,3,.....N * N构成,且每行、每列及两条对角线上的数字之和都相同。

当N为奇数时,我们可以通过下方法构建一个幻方:首先将1写在第一行的中间。之后,按如下方式从小到大依次填写每个数K(K=2,3,...,N * N) :

1.若 (K-1) 在第一行但不在最后一列,则将K填在最后一行, (K-1) 所在列的右一列;

2.若 (K-1) 在最后一列但不在第一行,则将K填在第一列, (K-1) 所在行的上一行;

3.若 (K-1) 在第一行最后一列,则将K填在 (K-1) 的正下方;

4.若 (K-1) 既不在第一行,也不在最后一列,如果 (K-1) 的右上方还未填数,则将K填在 (K-1) 的右上方,否则将K填在 (K-1) 的正下方。

输入

一个正整数N,即幻方的大小。

输出

共N行 ,每行N个整数,即按上述方法构造出的N * N的幻方,相邻两个整数之间用单空格隔开。

样例输入

3

样例输出

8 1 6
3 5 7
4 9 2

提示

对于100%的数据,保证1 <= N <= 39,且N为奇数。

 解题思路:

直接进行模拟就可以了

#include
using namespace std;
const int N=40;
int f[N][N],n,col,row;
int main() {
	cin>>n;
	row=1,col=n/2+1;
	f[row][col]=1;
	for(int i=2; i<=n*n; i++) {
		if(row==1&&col!=n) row=n,col++;
		else if(col==n&&row!=1)col=1,row--;
		else if(col==n&&row==1)row++;
		else {
			if(f[row-1][col+1]==0)row--,col++;
			else row++;
		}
		f[row][col]=i;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<

字符统计

题目描述

我们认为以下三种类型的字符是合法的:

1.阿拉伯数字0 ~ 9

2.小写字母a ~ z

3.大写字母A ~ Z

保证输入一个字符串,字符串中所有字符均是合法的。

请你统计一下字符串中存在多少种字符,两个字符不属于同一种,当且仅当两者的ASCII码不同。

输入

一个字符串。

输出

输出一个数,代表存在多少种字符。

样例输入

Aa0

样例输出

3

提示

对于100%的数据,保证 字符串长度不超过1000。

 解题思路:

相对字符串进行排序,然后判断每一个字符是否出现过,未出现过则ans++

#include
#define ll long long
using namespace std;
string arr;
ll ans=0;
int main()
{
	cin>>arr;
	sort(arr.begin(),arr.end());
	char tem=' ';
	for(int i=0;i

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