目录
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<bits/stdc++.h>
using namespace std;
map<int,int>mp;
set<int>s;
int n,c,t,ans;
int main()
{
cin>>n>>c;
for(int i=0;i<n;i++){
cin>>t;
s.insert(t);
mp[t]++;
}
for(auto i =s.begin();i!=s.end();i++)
{
ans+=mp[*i]*mp[(*i)+c];
}
cout<<ans<<endl;
}
神奇的幻方
题目描述
幻方是一种很神奇的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<bits/stdc++.h>
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<<f[i][j]<<" ";
}
cout<<endl;
}
}
字符统计
题目描述
我们认为以下三种类型的字符是合法的:
1.阿拉伯数字0 ~ 9
2.小写字母a ~ z
3.大写字母A ~ Z
保证输入一个字符串,字符串中所有字符均是合法的。
请你统计一下字符串中存在多少种字符,两个字符不属于同一种,当且仅当两者的
ASCII
码不同。输入
一个字符串。
输出
输出一个数,代表存在多少种字符。
样例输入
Aa0样例输出
3提示
对于100%的数据,保证 字符串长度不超过1000。
解题思路:
相对字符串进行排序,然后判断每一个字符是否出现过,未出现过则ans++
#include<bits/stdc++.h>
#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<arr.length();i++)
{
if(tem!=arr[i])
{
ans++;
tem=arr[i];
}
}
cout<<ans<<endl;
}