今天下午打了4个小时的比赛,本人打的是大学c组,在下午的模拟赛中,我有了新的体会。
首先我们要认真的读懂题目的意思,要让自己冷静下来,在清楚的记得在倒数第二题的时候,我没有明白题目的意思,我以为且是并且的意思,所以在打代码的时候就把if条件里面的关系变成了||,导致我改了半天才改回来。改代码真的很让人急躁。
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;cin>>n;
int a[n+1]={0};
for(int i=0;i<n;++i){
cin>>a[i];
}
int ans=0;
int cnt=0;
int max1=0;
int min1=100000;
for(int i=0;i<n;++i){
if(i==0){
if(a[i]<a[i+1]){
ans=a[i];
if(ans>max1){
max1=ans;
}
}
if(a[i]>a[i+1]){
if(cnt<min1){
min1=cnt;
}
}
}
if(i==n-1){
if(a[i]<a[i-1]){
ans=a[i];
if(ans>max1){
max1=ans;
}
}
if(a[i]>a[i-1]){
cnt=a[i];
if(cnt<min1){
min1=cnt;
}
}
break;
}
if(i>0){
if(a[i]<a[i-1]||a[i]<a[i+1]){
ans=a[i];
if(ans>max1){
max1=ans;
}
if(a[i]>a[i-1]||a[i]>a[i+1]){
cnt=a[i];
if(cnt<min1){
min1=cnt;
}
}
}
}
}
cout<<max1<<" "<<min1;
return 0;
}
代码中的||换成&&这样就可以通过了,所以说要认真的看题,理解题意
前面的题主要考的暴力,还有一点点思维,在做到编程题最后一题的时候,很明显的是dfs类型
但是我在定义数组的时候,定义的是静态数组,这也导致我在运行的时候会出错,在以前我知道vector这个stl容器
会自己判断数组的长度,也知道vector<int>a[m];这样是在定义二维数组,但是,我还没有明白我想定义n*m的二维数组
该怎么办,所以我在这出现了错误,在后面我经过上网查询以及chatgdp我知道了我的问题所在,我们在定义数组的时候不能确定n和m的值
如果把定义数组放在输入n和m后面,那么写的自定义函数dfs也会报错,所以我们只有定义动态的数组来解决问题
例如vector<vector<int>>a(n,vector<int>(m,0));这样就可以定义二维的动态数组,并且赋值为0
我是现在才知道是这样的。下面给你们看看题目以及最后一道题的解题,也不知道对不对,只是过了样例。还是收获了很多,每天进步一点点,一起准备4月省赛。
以前的代码在官方出了模拟赛过后我去试试,发现通过为0,但是还是有值得记录的地方,我就放在最后了,正解已经更新了
#include <bits/stdc++.h>
using namespace std;
const int N=1004;
int n,m;
char a[N][N];
const int dx[3]={-1,-1,1};
const int dy[3]={-1,1,0};
int dfs1(int x,int y,int cnt){
int nx=dx[0]+x;
int ny=dy[0]+y;
if(nx>=0&&nx<n&&a[nx][ny]==a[x][y]&&ny>=0&&ny<m){
//cnt++;
return dfs1(nx,ny,cnt+1);
//dfs1(nx,ny,cnt+1);
}
return cnt;
}
int dfs2(int x,int y,int cnt){
int nx=dx[1]+x;
int ny=dy[1]+y;
if(nx>=0&&nx<n&&a[nx][ny]==a[x][y]&&ny>=0&&ny<m){
//cnt++;
return dfs2(nx,ny,cnt+1);
//dfs2(nx,ny,cnt+1);
}
return cnt;
}
int dfs3(int x,int y,int cnt){
int nx=dx[2]+x;
int ny=dy[2]+y;
if(nx>=0&&nx<n&&a[nx][ny]==a[x][y]&&ny>=0&&ny<m){
//cnt++;
return dfs3(nx,ny,cnt+1);
//dfs3(nx,ny,cnt+1);
}
return cnt;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
cin>>a[i][j];
}
}
int ans=0;
for(int i=1;i<n;++i){
for(int j=1;j<m;++j){
if(a[i-1][j-1]==a[i][j]&&a[i-1][j+1]==a[i][j]&&a[i+1][j]==a[i][j]){
int num1=dfs1(i-1,j-1,1);
int num2=dfs2(i-1,j+1,1);
int num3=dfs3(i+1,j,1);
int num4=min(num1,min(num2,num3));
ans=max(ans,num4);
}
}
}
cout<<ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int nx[3] = {-1, 1, 0};
const int ny[3] = {1, 1, -1};
void dfs(int x, int y, int &ans, int &num, int &cnt, vector<vector<bool>> &s, vector<vector<char>> &a) {
s[x][y] = true;
for (int i = 0; i < 3; ++i) {
int dx = nx[i] + x;
int dy = ny[i] + y;
if (dx >= 0 && dx < s.size() && dy >= 0 && dy < s[0].size() && !s[dx][dy] && a[dx][dy] == a[x][y]) {
if (i == 0) {
ans++;
} else if (i == 1) {
num++;
} else if (i == 2) {
cnt++;
}
dfs(dx, dy, ans, num, cnt, s, a);
}
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<char>> a(n, vector<char>(m));
vector<vector<bool>> s(n, vector<bool>(m, false));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> a[i][j];
}
}
int number = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (!s[i][j]) {
int ans = 1, num = 1, cnt = 1;
dfs(i, j, ans, num, cnt, s, a);
int sum = min(ans, min(num, cnt));
number = max(number, sum);
}
}
}
cout << number;
return 0;
}