AcWing第 105 场周赛

AcWing 5029. 极值数量

给定一个长度为 n 的整数数组 a1,a2,…,an。

如果一个元素左右两边均有相邻元素(也就是不位于数组的两端),且满足以下两个条件之一:

  • 该元素的值严格大于其左右相邻元素的值
  • 该元素的值严格小于其左右相邻元素的值

则称该元素为一个极值元素。

请你计算,给定数组中有多少个极值元素。

输入格式

第一行包含整数 n。

第二行包含 n 个整数 a1,a2,…,an。

输出格式

一个整数,表示极值元素的数量。

数据范围

前 3 个测试点满足 1≤n≤5。
所有测试点满足 1≤n≤1000,1≤ai≤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∼n 之间的整数。

我们规定,数组中出现次数最多的元素为数组的核心元素,例如数组 [1,1,1,2,3] 的核心元素为 1。

此外,如果数组中出现次数最多的元素不唯一,则出现次数最多的元素中数值最小的那个元素为数组的核心元素,例如数组 [1,2,2,3,3] 的核心元素为 22。

对于 1≤i≤n 的每个整数 i,请你计算有多少个给定数组的非空连续子数组的核心元素为 i。

输入格式

第一行包含整数 n。

第二行包含 n 个整数 a1,a2,…,an。

输出格式

共一行,输出 n 个整数,其中第 i 个整数表示给定数组中核心元素为 i 的非空连续子数组的数量。

数据范围

前 3 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤5000,1≤ai≤n。

输入样例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×1 的方格矩阵,方格为白色:

你需要对该矩阵进行 k 次扩张操作,并输出最终得到的矩阵。

扩张操作的具体规则如下。

首先,给定一个 n×n 的方格矩阵,其中的每个方格要么是白色,要么是黑色,称此矩阵为模板矩阵。

在进行扩张操作时,当前矩阵中的每个方格都将扩张为一个 n×n 的方格矩阵,其中:

  • 每个白色方格扩张得到的方格矩阵与模板矩阵相同。
  • 每个黑色方格扩张得到的方格矩阵只包含黑色方格。

下面举例进行说明。

令 n=2,k=3,模板矩阵如下所示:

每一次扩张时,每个白色方格会扩张为

每一次扩张时,每个黑色方格会扩张为

第 1 次扩张后,得到一个 2×2 的方格矩阵:

第 2 次扩张后,得到一个 22×22 的方格矩阵:

第 3 次扩张后,得到一个 23×23 的方格矩阵:

这就是最终得到的矩阵。

输入格式

第一行包含两个整数 n,k。

接下来 n 行,每行包含 n 个字符,每个字符要么为 .,要么为 *,其中第 i 行第 j 个字符用来描述模板矩阵第 i 行第 j 列的方格颜色,. 表示白色,* 表示黑色。

保证模板矩阵中至少包含一个白色方格。

输出格式

输出一个 nk×nk 的字符矩阵,用来表示最终得到的矩阵。

. 表示白色方格,* 表示黑色方格。

数据范围

所有测试点满足 2≤n≤3,1≤k≤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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值