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;
}
}
总结:
因为之前在另一个平台刷题的使用习惯,使用更多的是容器,但是好像在比赛中使用数组的操作更加快,所以这个习惯在比赛中需要改回来,思路没什么问题