晚上七点准时开始牛课网比赛,一看A题“字典序最大的子序列”,刚开始就理解错题干了,以为是要求最长上升子序列的,以为理解题干后就开是用动规做,画表,找状态,想了一会后看了一下样例,感觉不对劲,又重新理解了一下题干,发现我理解错了,随即转换思路想其他算法,定义了一个指针p指向我要存数的数组,想着对p按字典序从大到小排序,而不改变原数组内的值,哎,错就错在这,把指针最重要的性质给忘了,改变指针中数据的同时,也把原数组给改变了,害的我改了一个多小时的程序,起初我还以为是map容器会自动排序呢,临比赛结束的时候才发觉是指针着出错了,还好不是省赛,不然真要凉...............
这次比赛犯得错误:1在没有完全理解题干的情况下开始想算法
2指针的性质遗忘
不过这次比赛还好没有一直死扣A题,一个多小时不知道怎么解,就换了下一道题,不知道这种做法是对还是不对?
这次只A了一道C题,能力有待提高~~~~~~
https://www.nowcoder.com/acm/contest/84#question
这道题只需要找不能通过题干要求连到一块的点的个数即可,最终答案便是这种点的个数-1;
#include<iostream> using namespace std; struct Dot { int x,y; }dot[101]; int n; int visited[1001][1001]; int flag; void dfs(int xi,int yi,int d)//d是用来判读由这个点是沿x方向遍历,还是沿y方向遍历,d为0是沿x方向,d为1时沿y方向,d为2时说明这个点是起始点,x,y方向都需要遍历 { int i,j; if(d==2||d==0) { for(i=1;i<1000;i++) { int xr=xi+i;//从此点往右走 if(xr>1000)//判断是否可以往右走 break; if(visited[xr][yi]==1) { visited[xr][yi]=2;//当某一点被便利后,用把visited赋值为2来记录 dfs(xr,yi,1); } } for(i=1;i<1000;i++) { int xl=xi-i;//从此点往左走 if(xl<1) //判断是否可以往左走 break; if(visited[xl][yi]==1) { visited[xl][yi]=2; dfs(xl,yi,1); } } } if(d==2||d==1) { for(i=1;i<1000;i++) { int yu=yi+i;//从此点往上走 if(yu>1000)//判断是否可以往上走 break; if(visited[xi][yu]==1) { visited[xi][yu]=2; dfs(xi,yu,0); } } for(i=1;i<1000;i++) { int yd=yi-i;//从此点往下走 if(yd<1)//判断是否可以往下走 break; if(visited[xi][yd]==1) { visited[xi][yd]=2; dfs(xi,yd,0); } } } } int main() { int i; cin>>n; for(i=0;i<n;i++) { cin>>dot[i].x>>dot[i].y; visited[dot[i].x][dot[i].y]=1;//记录点的位置,用1存到visited中 } flag=0; for(i=0;i<n;i++) { if(visited[dot[i].x][dot[i].y]==2)//判断此点是否已被遍历过 continue; visited[dot[i].x][dot[i].y]=2; dfs(dot[i].x,dot[i].y,2); flag++; } cout<<flag-1<<endl; return 0; }