首页 / 资讯中心 / 文章详情

CSP-J模拟四

CSP-J模拟四 ★ FEATURED ARTICLE
题目分数220分第一题100分第二题100分第三题15分第四题5分题目详解第一题题目大意在一个四维矩形中有x,y,z,w四个边界点现在给定了n组四维点需编写代码判断是否在矩形内。考试过程签到题10分钟就过了。正解直接去分别判断点是否在区间之内。AC代码#includebits/stdc.h using namespace std; long long n,cnt,lx,ly,lz,lw,rx,ry,rz,rw; struct in{ long long x,y,z,w; }a[100005]; int main(){ scanf(%lld,n); for(int i1;in;i){ scanf(%lld%lld%lld%lld,a[i].x,a[i].y,a[i].z,a[i].w); } scanf(%lld%lld%lld%lld,lx,ly,lz,lw); scanf(%lld%lld%lld%lld,rx,ry,rz,rw); for(int i1;in;i){ if(a[i].xrxa[i].xlx){ if(a[i].yrya[i].yly){ if(a[i].zrza[i].zlz){ if(a[i].wrwa[i].wlw){ cnt; } } } } } coutcnt; return 0; }第二题题目大意有n个范围在1~m的数我们可以将两个数合并成一个比它大一的数问这n个整数最多能得到多少个x考试过程看到这个题想了想就出来了。正解直接去分析每个数的个数就可以。AC代码#includebits/stdc.h using namespace std; long long n,m,q,a[1000005],ans[1000005],b[1000005]; long long l; int main(){ scanf(%lld%lld,n,m); for(int i1;in;i){ scanf(%lld,a[i]); b[a[i]]; } scanf(%lld,q); for(int i1;im;i){ ans[i]b[i]ans[i-1]/2; } for(int i1;iq;i){ scanf(%lld,l); printf(%lld\n,ans[l]); } return 0; }第三题题目大意有一个图图中#代表障碍物不可以走。现在有两个机器人各自从自己的起点出发每次两个机器人都得是同一个方向移动。问需几步移动才能同时到达终点。考试过程不太会就去骗分。骗到了15分。错因纯骗分也只想拿10分。我的代码#includebits/stdc.h using namespace std; long long n,m,t1,t2,t3,t4,s1,s2,s3,s4,le[40]; char c[40][40]; int dx[]{0,0,1,-1}; int dy[]{1,-1,0,0}; int main(){ scanf(%lld%lld,n,m); for(int i1;in;i){ for(int j1;jm;j){ cinc[i][j]; } } scanf(%lld%lld,t1,t2); scanf(%lld%lld,s1,s2); scanf(%lld%lld,t3,t4); scanf(%lld%lld,s3,s4); coutt2-s2; return 0; }正解用bfs搜索但因为是同步所以要把四个点在一起处理若向前走不了就保持在原地剩下就是模板题。AC代码#includebits/stdc.h using namespace std; long long n,m,dis[35][35][35][35]; int dx[]{0,0,1,-1},dy[]{1,-1,0,0}; char s[35][35]; bool vis[35][35][35][35]; arrayint,4 st,ed; void input(arrayint,4 x){ cinx[0]x[1]x[2]x[3]; } arrayint,4 move(arrayint,4 x,int d){ x[0]dx[d],x[1]dy[d]; if(s[x[0]][x[1]]!.){ x[0]-dx[d],x[1]-dy[d]; } x[2]dx[d],x[3]dy[d]; if(s[x[2]][x[3]]!.){ x[2]-dx[d],x[3]-dy[d]; } return x; } bool check(arrayint,4 x){ if(s[x[0]][x[1]]!.||s[x[2]][x[3]]!.){ return 0; } if(vis[x[0]][x[1]][x[2]][x[3]]){ return 0; } return 1; } void bfs(){ queuearrayint,4 q; q.push(st); vis[st[0]][st[1]][st[2]][st[3]]1; while(!q.empty()){ arrayint,4 xq.front(); q.pop(); for(int i0;i4;i){ arrayint,4 tmpmove(x,i); if(!check(tmp)){ continue; } vis[tmp[0]][tmp[1]][tmp[2]][tmp[3]]1; dis[tmp[0]][tmp[1]][tmp[2]][tmp[3]]dis[x[0]][x[1]][x[2]][x[3]]1; q.push(tmp); } } } int main(){ cinnm; for(int i1;in;i){ scanf(%s,s[i]1); } input(st),input(ed); bfs(); if(vis[ed[0]][ed[1]][ed[2]][ed[3]]){ coutdis[ed[0]][ed[1]][ed[2]][ed[3]]; } else{ cout-1; } return 0; }第四题题目大意有一个n×m的矩阵每个子矩阵的快乐值是这个矩阵的所有数的疑惑和问所有子矩阵的快乐值之和。考试过程写了60多行的代码结果错了。心态崩了就只想去骗分了。错因骗分,骗了5分也觉得只该得5分。正解输入后枚举up和down每次加上新一列的数的异或和。再二进制拆位处理完就再转换回去。AC代码#includebits/stdc.h using namespace std; long long n,m,a[310][310],yih,ans,zh,b[310],sum[310]; int main(){ scanf(%lld%lld,n,m); for(int i1;in;i){ for(int j1;jm;j){ scanf(%lld,a[i][j]); } } for(int u1;un;u){ memset(b,0,sizeof(b)); for(int du;dn;d){ for(int j1;jm;j){ b[j]^a[d][j]; sum[j]sum[j-1]^b[j]; } for(int p0;p10;p){ long long cnt[2]{1,0}; for(int j1;jm;j){ int t(sum[j]p)1; ans(1p)*cnt[t^1]; cnt[t]; } } } } coutans; return 0; }
阅读完成 · 觉得有帮助?
咨询建站