A. Pasha and Pixels
题意:有一个n*m的矩形格阵,刚开始的时候都是白色的。现在每次进行一个操作,把白方块或黑方块(已变颜色)变为黑色。注意变为黑色后不能转化为白色。输出最早形成2*2黑色正方形的步数。
题解:很简单的思路,数组标记,调用函数判断。有一点需要注意一下,在使用bits/stdc++.h时包含所有c++内头文件,但是c里的输入输出不在其内,所以一些c里的还是需要添加的。错了两次,一次是编译错误,一次是疏忽,还是得再细心一点。
附代码:
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1005
using namespace std;
int maze[MAX_N][MAX_N];
bool if_form(int x,int y);
int main()
{
int n,m,k;
int x,y;
int result=0;
cin>>n>>m>>k;
memset(maze,0,sizeof(maze));
for( int i = 1; i <= k; i++ )
{
cin>>x>>y;
if( maze[x][y] == 1 )
continue;
maze[x][y] = 1;
if( if_form(x,y) && result == 0)
result = i;
}
printf("%d\n",result);
return 0;
}
bool if_form(int x,int y)
{
if(maze[x-1][y]==1 && maze[x][y+1]==1 && maze[x-1][y+1]==1)
return true;
else if(maze[x+1][y]==1 && maze[x][y+1]==1 && maze[x+1][y+1]==1)
return true;
else if(maze[x+1][y]==1 && maze[x][y-1]==1 && maze[x+1][y-1]==1)
return true;
else if(maze[x-1][y]==1 && maze[x][y-1]==1 && maze[x-1][y-1]==1)
return true;
else
return false;
}
B. Anton and currency you all know
题意:给你一个2~10^5位的奇数,需要你通过交换大数里的两位得到一个最大的偶数,不能得到的话输出-1.
题解:这道题纠结了很久,一直到最后都没有解出来。现在再回过头看这道题,我觉得还是要有一个清晰地头脑,分析现有的条件,逐一对应的去寻找最合适的数据结构与算法。首先,题目要求500ms,比一般都小,这就要求我们要很注意数据的操作,精简操作步骤,防止超时;其次,大数据,10^5,不可能用int 或 long long 去存储,所以只能用数组去存储,char型数组是最合适的;最后题目要求最大的偶数,既然时间复杂度上要非常注意,如何比较去得到最大呢?最初想对每一个偶数位进行操作比较,尝试了很久依然会超时。很费解。最后回归到本质,既然想要求最大的偶数,我们从最高位向右比较,如果遇到比最后一位小的偶数,直接替换之后break,如果所有偶数都大于最后一位,交换最后一个偶数,这样得到的偶数是最小的。只需要对每一位比较不储存,最后交换一次,时间复杂度够用。但是究竟500ms的时间复杂度能承受多大还是很模糊,还是要请教一下学长。。。
附代码:
#include <bits/stdc++.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100005
using namespace std;
int show[12];
char save[MAX_N];
char num[MAX_N];
long long length;
int pos;
bool change(int x,int y);
int main()
{
cin>>num;
memset(show,0,sizeof(show));
length=strlen(num);
save[0]='0'; pos=-1;
for( int i = 0; i < length-1; i++)
{
if( (num[i]-'0')%2==0 )
{
pos = i;
if( num[length-1] > num[i] )
break;
}
}
swap(num[pos],num[length-1]);
if( pos== -1 )
printf("-1\n");
else
printf("%s\n",num);
return 0;
}
bool change(int x,int y)
{
swap(num[x],num[y]);
if( num[pos] > save[pos] )
{
if( strlen(save) != 1 )
{
swap(save[pos],save[y]);
swap(save[x],save[y]);
pos = x;
}
else
{
strcpy(save,num);
pos=x;
}
}
swap(num[x],num[y]);
return true;
}
这次感觉要比上次难,只做出来了一道题。但是还好吧,慢慢进步,自己需要学的还很多,每一次都总结一下经验,收获一些东西,挺好的。加油!!