牛客竞赛小白赛17题解

1.小sun的假期

题目:

求出数组中的最长连接数

思路:

我的思路:先把全部的输入数从大到小整合起来(全部重复的忽略,部分重复的就合成一个时间段),然后遍历数组找出最长连接数

网络的思路:直接按照每组的第一个数来排序,(nowl,nowr分别初始化为第一个数的l,r值),从第二个数开始,只要r大于nowr就改nowr值,只要l小于nowr就跳过。(还没搞懂)

代码:

我的代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
 
const int maxn=le5+5;
 
struct node {
    int l,r;
}
node f[maxn];
int n.m.res=0;
int cop(node a,node b) {
    return a.l<b.l;
}
 
int main() {
    cin>>n>>m;
    for(int i=0;i<m;i++) {
        scanf("%d%d",&f[i].l,&f[i].r);
        sort(f,f+m,cop);
         
    }
}

网上的代码:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e5+5;
struct node{
    int l,r;
};
node f[maxn];
int n,m,ans=0;
int cmp(node a,node b){
    return a.l<b.l;
}
int main(){
    cin>>n>>m;
    for(int i=0;i<m;i++)scanf("%d%d",&f[i].l,&f[i].r);
    sort(f,f+m,cmp);
    ans=max(ans,f[0].l-1);
    int nowl=f[0].l,nowr=f[0].r;
    for(int i=1;i<m;i++){
        if(f[i].r>nowr)nowr=f[i].r;
        if(f[i].l<nowr)continue;
        ans=max(ans,f[i].l-nowr-1);
        nowl=f[i].l;
    }
    ans=max(ans,n-nowr);
    printf("%d",ans);
}

总结:

我和代码计算最长连接数的思路有点问题,暂时没有搞懂题目的思路。

 

2.扫雷

题目:

根据一个数组求出有多少个雷,很简单

思路:

分别判断当前的八个方向是否为有效方向,如果是再判断该方向的值是否为雷

我使用的是vector容器,网上使用的是数组存储,我的就超时了,不知道是不是容器的操作比数组的慢,以后还是都使用数组吧

代码:

我的代码:

#include<iostream>
#include<vector>
#include<string>
 
using namespace std;
 
int calnum(vector<vector<char>> ivec,int i,int j) {
    if(ivec[i][j]=='*') {
        return -1;
    }
    int N=ivec.size(),M=ivec[0].size();
    int res=0;
    if(i-1>=0&&ivec[i-1][j]=='*') {
        res++;
    }
    if(j-1>=0&&ivec[i][j-1]=='*') {
        res++;
    }
    if(i+1<N&&ivec[i+1][j]=='*') {
        res++;
    }
    if(j+1<M&&ivec[i][j+1]=='*') {
        res++;
    }
    if(i-1>=0&&j-1>=0&&ivec[i-1][j-1]=='*') {
        res++;
    }
    if(i-1>=0&&j+1<M&&ivec[i-1][j+1]=='*') {
        res++;
    }
    if(i+1<N&&j-1>=0&&ivec[i+1][j-1]=='*') {
        res++;
    }
    if(i+1<N&&j+1<M&&ivec[i+1][j+1]=='*') {
        res++;
    }
    return res;
}
 
int main() {
    int n,m;
    char c;
    vector<vector<char>> cvec;
    vector<char> tmp;
    cin>>n>>m;
    for(int i=0;i<n;i++) {
        for(int j=0;j<m;j++) {
            cin>>c;
            tmp.push_back(c);
        }
        cvec.push_back(tmp);
        tmp.clear();
    }
    for(int i=0;i<n;i++) {
        for(int j=0;j<m;j++) {
            int res=calnum(cvec,i,j);
            if(res>=0) {
                cout<<res;
            } else {
                cout<<'*';
            }
        }
        if(i!=n-1) {
            cout<<endl;
        }
    }
    return 0;
}

网上的代码:

#include<iostream>
#include<cstdio>
using namespace std;
char a[1005][1005];
int sum(int i,int j,int n,int m) {
    int sum1 = 0;
    if (i - 1 >= 0 && j - 1 >= 0 && a[i - 1][j - 1] == '*') sum1++;
    if (i - 1 >= 0 && a[i - 1][j] == '*') sum1++;
    if (i - 1 >= 0 && j + 1 < m && a[i - 1][j + 1] == '*') sum1++;
    if (j + 1 < m && a[i][j + 1] == '*') sum1++;
    if (i + 1 < n && j + 1 < m && a[i + 1][j + 1] == '*') sum1++;
    if (i + 1 < n && a[i + 1][j] == '*') sum1++;
    if (i + 1 < n && j - 1 >= 0 && a[i + 1][j - 1] == '*') sum1++;
    if (j - 1 >= 0 && a[i][j - 1] == '*') sum1++;
    return sum1;
  
}
int main()
{
    int  n, m, i, j;
    cin >> n >> m;
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            cin >> a[i][j];
  
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            if (a[i][j] == '*')
                cout << '*';
            else {
                cout << sum(i, j,n,m);
            }
        }
        cout << endl;
    }
  
      
}

总结:

因为之前在另一个平台刷题的使用习惯,使用更多的是容器,但是好像在比赛中使用数组的操作更加快,所以这个习惯在比赛中需要改回来,思路没什么问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值