2024年1月14日牛客周赛round28补题

B、小红的字符串

思路:比赛中我的思路是通过substr函数提取长度为2的字符串字串,再通过比较ASCLL码进行交换,但是这样写导致了运行超时。根据讲解,可以用sort函数进行排序。

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string str;

int main(){
    string s;
    cin>>s;
    int length=s.length();
    if(length<2) return 0;
    const int n=length-1;
    string substrings[n];
    
    for(int i=0;i<n;++i){
        substrings[i]=s.substr(i,2);
    }
    sort(substrings,substrings+n);//长度为n的字符串恰好会有n-1个长度为2的连续字串
    for(int i=0;i<n;i++){
      cout<<substrings[i]<<endl;  
    }
    return 0;
}

根据讲解,在提取字串时还可以使用另一种方式,通过将前一个字符和当前字符拼接到一起就组成了长为2的串

    for(int i=0;i<length;++i){
       string temp;
        temp+=s[i-1];
        temp+=s[i];
        substrings[i-1]=temp;
    }

C、炸砖块 

 思路:比赛中不知道该用什么知识去解决,不敢写,纠结的地方在于砖块下落该如何处理。赛后想了一下可以通过swap函数进行交换,注意在炸砖块时不能仅仅把炸的区域变为空,应该是先调整位置,防止砖块重复被炸。

#include<iostream>

using namespace std;


int main(){
    char zhuan[1010][1010];
    int n,m,k;
    cin>>n>>m>>k;
    
    for(int i=0;i<n;i++){//初始化矩阵
        for(int j=0;j<m;j++){
            zhuan[i][j]='*';
        }   
    }
    int x,y;
    for(int i=0;i<k;i++){
        cin>>x>>y;
        x--;
        y--;
        for(int i=x;i>=0;i--){//应该是从底部向上面遍历,如果该部位有砖块,一定是上面没有砖块
            if(zhuan[i][y]=='*'){
                zhuan[i][y]='.';
                break;
            }
        }
        for(int i=x;i>0;i--){
            if(zhuan[i][y]=='.'&&zhuan[i-1][y]=='*'){//将上方的砖块下移
                swap(zhuan[i][y],zhuan[i-1][y]);
            }
        }
        
    }
 
    
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<zhuan[i][j];
        }
        cout<<endl;
    }
    return 0;
}

D、小红的统计区间(easy)

思路: 双指针模型,固定左端点,右端点向右,一直到和不小于k,右端点加右侧剩下的点的和就是左端点满足区间的个数,随后移动左端点重复。

#include<iostream>
#include<string>
using namespace std;

int a[100010];

int main(){
    long long n,i,k,sum=0,res=0;
    cin>>n>>k;
    
    for(i=1;i<=n;i++) cin>>a[i];
    
    int j=1;
    
    for(i=1;i<=n;i++)
    {
       sum+=a[i];
        while(sum>=k){
            sum-=a[j];
            j++;
        }
        res+=j-1;
        
    }
    cout<<res;
   
    return 0;
}

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值