2021-11-17 (2020 CCPC网络赛)

F - Reports

题意:

t组样例,每个样例给你一个n,接下来n个数只包含0和1(0为离校,1为出校)

你需要判断这n个动作中是否有记录错误的。

思路:

出校和离校必然都是挨着出现的,即当出现两个相同动作时就出现错误。

代码:

#include<iostream>
using namespace std;
int a[100];
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        bool flag=true;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<n;i++)
        {
            if(a[i]==a[i+1])
            {
                flag=false;
                break;
            }
        }
        if(flag)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;

    }
}

B - Express Mail Taking

题意:

t组样例,每个样例给你一个n,m,k,接下来每个数。

n表示有1-n的邮局,m表示你要投的邮件数量,接下来的m个数即对应的邮局地址,而这些地址中不会出现k,k表示一个特殊的邮局,你送邮件之前都要先进这个邮局再去送邮件,你需要求最小的送玩全部邮件的距离。(初始点都从1出发,最后回到1)

思路:

贪心模拟,当你列举完所有ai大于小于k的情况会发现,你从1到k再回1时必然执行的即初始化

2*(k-1),sort从小到大排序后,若所有ai大于k的情况,即每个位置到k之间都要走两遍,最后从k到1(这个已经在2*(k-1)里了),若所有ai小于k的情况,也是每个位置到k之间都要走两遍

除了最小的a0,因为从k到a1,在回到k。这是a1到k的两遍,而之后你就是从k到a0,再从a0到1即k-1(这个已经在2*(k-1)里了),所以如果a0不用计算。

最后初始化必走距离为2*(k-1),计算出所有位置到k距离的2倍,判断a0是否小于k,小于相当于你之前多计算了a0到k的距离,减去即可,不小于k正常输出即可。

(注意用scanf而不能用cin关ios也没用)

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000005];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long n,m,k,ans;
        scanf("%lld%lld%lld",&n,&m,&k);
        for(int i=0; i<m; i++)
            scanf("%d",&a[i]);
        sort(a,a+m);
        ans=2*(k-1);
        for(int i=0; i<m; i++)
        {
            ans+=2*abs(k-a[i]);

        }
        if(a[0]<k)
        {
            ans-=2*(k-a[0]);
        }
        printf("%lld\n",ans);
    }
}

E - CCPC Training Class

题意:

小火山正在帮助他的CCPC教练准备一个新的CCPC训练比赛,他想生成关于边链树的高质量数据(不需要知道边链树是什么),但是遇到了一些麻烦,你能帮他一下吗?

在本段中,我们正式定义了数据质量问题,对于一些字符串s=s1s2s3···sn,我们使用s[ l:r ]表示从l到r的子字符串,如果l>r,则s[ l:r ]为空。 我们进一步的定义:

表示第i个位置的最长边,则定义D(i)表示第i个位置的边链长度:

该字符串的质量W定义为D的最大值:

为了防止用单纯的蛮力算法区分边界树,小火山需要生成字符串,使其质量W尽可能大。现在给定一个字符串s, 你可以任意排列该字符串。你们能计算出字符串排列后能达到的最大质量是多少吗?

思路:

总结以及看样例发现找到这个字符串中字符出现次数最多的输出次数即可。遍历记录一下字符出现次数在找最大值输出就行了。(注意输出cin和printf不要一起用,输出会炸的)

代码:


#include<iostream>
#include<cstdio>
using namespace std;
int num[30];
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    for(int cnt=1;cnt<=t;cnt++)
    {
        string s;
        cin>>s;
        int x;
        int maxx=-1;
        for(int i=0;i<s.size();i++)
        {
             x=s[i]-'a';
             num[x]+=1;
        }
        for(int i=0;i<26;i++)
        {
            maxx=max(maxx,num[i]);
            num[i]=0;
        }
         cout<<"Case #"<<cnt<<": "<<maxx<<endl;
    }
}

G - 3x3 Convolution

题意:

有一个n x n的矩阵A和一个3 x 3的矩阵K,均为非负矩阵,并且K是一个和为1的分数矩阵。定义一个操作,对于矩阵A,用矩阵K对A中的每个元素进行卷积操作------K的左上角遍历A中每个元素,每一次覆盖对A中3 x 3范围内(范围不够的在A的边缘补上足够多的0)的矩阵在K的作用下作带权求和运算。现在将矩阵K固定,拿C套娃无限次,求最终得到的矩阵。

思路:

判断矩阵K的 K[1][1] 是否为1 即可;是的话输出原矩阵A,否则输出0矩阵;

首先K是一个小数矩阵,A是个整数矩阵,答案是整数矩阵;所以C11一定是整数。

相当于A 3*3 这个矩阵和K矩阵乘了无限次;要想C11是整数,那么K11一定是整数,因为K矩阵式小数矩阵且和为1,那么K11=1。

 带图解释在这里

代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=55;
int a[55][55],k[4][4];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                scanf("%d",&a[i][j]);
            }
        int sum=0;
        for(int i=1; i<=3; i++)
            for(int j=1; j<=3; j++)
            {
                scanf("%d",&k[i][j]);
                sum+=k[i][j];
            }

        int temp=1;
        if(sum/k[1][1]!=1)
            temp=0;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                printf("%d%c",a[i][j]*temp,j==n?'\n':' ');

    }
}

上一篇:痞子衡嵌入式:深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程


下一篇:FPGA学习-1:什么是FPGA