AcWing 5029. 极值数量
给定一个长度为 n� 的整数数组 a1,a2,…,an�1,�2,…,��。
如果一个元素左右两边均有相邻元素(也就是不位于数组的两端),且满足以下两个条件之一:
- 该元素的值严格大于其左右相邻元素的值
- 该元素的值严格小于其左右相邻元素的值
则称该元素为一个极值元素。
请你计算,给定数组中有多少个极值元素。
输入格式
第一行包含整数 n�。
第二行包含 n� 个整数 a1,a2,…,an�1,�2,…,��。
a
输出格式
一个整数,表示极值元素的数量。
数据范围
前 33 个测试点满足 1≤n≤51≤�≤5。
所有测试点满足 1≤n≤10001≤�≤1000,1≤ai≤10001≤��≤1000。
输入样例1:
3
1 2 3
输出样例1:
0
输入样例2:
4
1 5 2 5
输出样例2:
2
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
int cnt = 0;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
if(i!=0&&i!=n-1){
if(a[i]<a[i-1]&&a[i]<a[i+1]) cnt++;
if(a[i]>a[i-1]&&a[i]>a[i+1]) cnt++;
}
}
cout<<cnt;
return 0;
}
AcWing 5030. 核心元素
给定一个长度为 n� 的整数数组 a1,a2,…,an�1,�2,…,��,数组中的每个元素都是一个 1∼n1∼� 之间的整数。
我们规定,数组中出现次数最多的元素为数组的核心元素,例如数组 [1,1,1,2,3][1,1,1,2,3] 的核心元素为 11。
此外,如果数组中出现次数最多的元素不唯一,则出现次数最多的元素中数值最小的那个元素为数组的核心元素,例如数组 [1,2,2,3,3][1,2,2,3,3] 的核心元素为 22。
对于 1≤i≤n1≤�≤� 的每个整数 i�,请你计算有多少个给定数组的非空连续子数组的核心元素为 i�。
输入格式
第一行包含整数 n�。
第二行包含 n� 个整数 a1,a2,…,an�1,�2,…,��。
输出格式
共一行,输出 n� 个整数,其中第 i� 个整数表示给定数组中核心元素为 i� 的非空连续子数组的数量。
数据范围
前 33 个测试点满足 1≤n≤101≤�≤10。
所有测试点满足 1≤n≤50001≤�≤5000,1≤ai≤n1≤��≤�。
输入样例1:
4
1 2 1 2
输出样例1:
7 3 0 0
输入样例2:
3
1 1 1
输出样例2:
6 0 0
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5010;
int a[N];
int cnt[N][5010];
int ans[N];
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
{
scanf("%d",&a[i]);
for(int j=1;j<=n;j++)
{
if(j==a[i]) cnt[i][j]=cnt[i-1][j]+1;
else cnt[i][j]=cnt[i-1][j];//每个数字出现次数的前缀和
}
}
for(int i=1;i<=n;i++)
{
ans[a[i]]++;
int id=a[i];
int mx=1;
for(int j=i+1;j<=n;j++)
{
//cout<<i<<" "<<j<<" "<<id<<endl;
if(cnt[j][a[j]]-cnt[i-1][a[j]]>mx || (cnt[j][a[j]]-cnt[i-1][a[j]]==mx && a[j]<id))
{
mx=cnt[j][a[j]]-cnt[i-1][a[j]];//直接进行比较,每新遍历一个数就与原来的最大值比较
id=a[j];
}
ans[id]++;
}
}
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
}
AcWing 5031. 矩阵扩张
给定一个 1×11×1 的方格矩阵,方格为白色:
你需要对该矩阵进行 k� 次扩张操作,并输出最终得到的矩阵。
扩张操作的具体规则如下。
首先,给定一个 n×n�×� 的方格矩阵,其中的每个方格要么是白色,要么是黑色,称此矩阵为模板矩阵。
在进行扩张操作时,当前矩阵中的每个方格都将扩张为一个 n×n�×� 的方格矩阵,其中:
- 每个白色方格扩张得到的方格矩阵与模板矩阵相同。
- 每个黑色方格扩张得到的方格矩阵只包含黑色方格。
下面举例进行说明。
令 n=2,k=3�=2,�=3,模板矩阵如下所示:
每一次扩张时,每个白色方格会扩张为
每一次扩张时,每个黑色方格会扩张为
第 11 次扩张后,得到一个 2×22×2 的方格矩阵:
第 22 次扩张后,得到一个 22×2222×22 的方格矩阵:
第 33 次扩张后,得到一个 23×2323×23 的方格矩阵:
这就是最终得到的矩阵。
输入格式
第一行包含两个整数 n,k�,�。
接下来 n� 行,每行包含 n� 个字符,每个字符要么为 .
,要么为 *
,其中第 i� 行第 j� 个字符用来描述模板矩阵第 i� 行第 j� 列的方格颜色,.
表示白色,*
表示黑色。
保证模板矩阵中至少包含一个白色方格。
输出格式
输出一个 nk×nk��×�� 的字符矩阵,用来表示最终得到的矩阵。
.
表示白色方格,*
表示黑色方格。
数据范围
所有测试点满足 2≤n≤32≤�≤3,1≤k≤51≤�≤5。
输入样例1:
2 3
.*
..
输出样例1:
.*******
..******
.*.*****
....****
.***.***
..**..**
.*.*.*.*
........
输入样例2:
3 2
.*.
***
.*.
输出样例2:
.*.***.*.
*********
.*.***.*.
*********
*********
*********
.*.***.*.
*********
.*.***.*.
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 5010;
char s[N][N],g[N][N];
char a[N][N];
int n,m,k;
int main()
{
cin>>n>>k;
int kk=k;
int m=n;
k--;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cin>>a[i][j],s[i][j]=a[i][j];
}
while(k--){
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(s[i][j]=='.')
{
for(int x=0;x<m;x++){
for(int y=0;y<m;y++)
{
g[i*m+x][j*m+y]=a[x][y];
}
}
}
return 0;
}