郑轻新生周赛(4)

本文介绍了多种算法的实现思路,包括字母频率排序、多实例问题解决、循环节计算以及区间查找。通过C++代码展示了如何处理这些问题,涉及排序、数组操作和动态规划等技巧。这些算法在数据处理和问题解决中具有广泛应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 问题B

 题目C:

题目D

问题H

问题I


 问题B

思路一:

字母数量少的先输出,定义一个结构体,将字母与出现的次数绑定,然后排序输出即可

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

const int N = 60;
int m;

struct point{
    char x;
    int  y=0;
}len[N];

bool cmp(point a,point b){
    if(a.y<b.y)return true;
    return false;
}

int main(){
    cin>>m;
    for(int i=0;i<m;i++){
        char c;
        cin>>c;
        len[c-'a'].x=c;
        len[c-'a'].y++;
    }
    sort(len,len+26,cmp);
    for(int i=0;i<=26;i++){
        if(len[i].y!=0)
        cout<<len[i].x;
    }
}

 思路二:

通过将用三个数组,一个数组用于记录字母,一个用于记录数目,一个用于记录前两个数组和并后大小的位置

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

const int N=60;
int m;
char s[N];
int len[N];
char res[N];
int mx;

int main(){
    cin>>m;
    for(int i=0;i<m;i++){
        cin>>s[i];
        len[s[i]-'a'+1]++;
    }
    for(int i=1;i<=26;i++){
        if(len[i]){
            res[len[i]]='a'+i-1;
            if(len[i]>mx)mx=len[i];
        }
    }
    for(int i=1;i<=mx;i++)cout<<res[i];
}

 题目C:

 

思路:

多实例,用两个数组,一个用于记录输入的值,一个用于记录值得个数

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

const int N = 1e6;
int t;
int len[N];
int res[N];
int ans;

int main(){
    cin>>t;
    while(t--){
        int n,x;
        cin>>n>>x;
        for(int i=0;i<n;i++){
            cin>>len[i];
            res[len[i]]++;
        }
        ans=0;
        sort(len,len+n);
        for(int i=0;i<n;i++){
            if(!res[len[i]])
            continue;
            if(len[i]*x>100000)
            ans++;
            if(!res[len[i]*x])
            ans++;
            else if(res[len[i]*x])
            res[len[i]*x]--;
            res[len[i]]--;
        }
        cout<<ans<<endl;
    }
}

题目D

 

代码实现:

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

const int N=15;
int q;
long long ans,sum1;
long long n,m;
int sum;
int len[N];//存储循环节

void slove(){
    for(int i=0;i<=9;i++){
        len[i]=m*i%10;
        sum+=len[i];
    }
    //查看有多少循环节
    ans=n/m/10;
    sum1=ans*sum;
    for(int i=1;i<=n/m%10;i++){
        if(len[i])
        sum1+=len[i];
    }
    cout<<sum1<<endl;
}

int main(){
    cin>>q;
    while(q--){
        memset(len,0,sizeof(len));
        sum1=0;
        sum=0;
        cin>>n>>m;
        slove();
    }
}

问题H

 

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

const int N = 1e3;
int n,m;
int mp[N][N];

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>mp[i][j];
            mp[i][j]+=mp[i-1][j]+mp[i][j-1]-mp[i-1][j-1];
        }
    }
    int mx=0;
    for(int d=2;d<=min(n,m);d++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(i+d-1>n||j+d-1>m)
                break;
                int x=mp[i+d-1][j+d-1]-mp[i+d-1][j-1]-mp[i-1][j+d-1]+mp[i-1][j-1];
                if(x==d*d)mx=max(mx,d);
            }
        }
    }
    cout<<mx;
}

问题I

 

思路:

用前缀和将D的每段数目存储起来,然后用l,r来维护一端序列

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

const int N=1010;
int n,m;
char res[N];
int len[N];

int main(){
    cin>>n>>m;
    for(int i=1;i<n;i++){
        cin>>res[i];
        if(res[i]=='D')
        len[i]=1;
        else
        len[i]=0;
        len[i]+=len[i-1];
    }
    int ans=0;
    for(int i=1;i<=n;i++){//枚举区间长度
        for(int l=1;l+i-1<=n;l++){
            int r=l+i-1;
            if(m>=i-len[r]+len[l-1]){
                ans=i;
                break;
            }
        }
    }
    cout<<ans;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值