五月模拟题(C++)编程部分

说一下3题思路+代码#笔试题目##C/C++#
全部评论
没有模板写不出来😂
点赞 回复 分享
发布于 2019-05-15 21:40
第三题,迷宫问题,直接bfs 不多说了,上代码 #include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; int n; char mp[1010][1010]; struct node {     int x,y,k; }; int dir[4][2]={1,0,-1,0,0,1,0,-1}; int x,y,ans; queue<node>qu; int vis[1010][1010]; int main() {     scanf("%d",&n);     memset(mp,'#',sizeof(mp));     node temp,temp1;     for(int i=1;i<=n;i++)     {         for(int j=1;j<=n;j++)         {             scanf(" %c",&mp[i][j]);             if(mp[i][j]=='@')             {                 temp.x=i;                 temp.y=j;                 temp.k=0;                 vis[i][j]=1;                 qu.push(temp);             }             if(mp[i][j]=='*')             {                 x=i;                 y=j;             }         }     }     while(!qu.empty())     {         temp=qu.front();         qu.pop();         if(temp.x==x&&temp.y==y)         {             ans=temp.k;             break;         }         for(int i=0;i<4;i++)         {             temp1.x=temp.x+dir[i][0];             temp1.y=temp.y+dir[i][1];             temp1.k=temp.k+1;             if(mp[temp1.x][temp1.y]!='#'&&!vis[temp1.x][temp1.y])             {                 vis[temp1.x][temp1.y]=1;                 qu.push(temp1);             }         }     }     printf("%d\n",ans); }
点赞 回复 分享
发布于 2019-05-15 21:15
两个60%,第一个还超时了,第三个没弄出来,,,,菜是原罪
点赞 回复 分享
发布于 2019-05-15 21:14
第二题,买票问题 其实就是一个背包,将一张票一张票的购买视为第m+1种物品 有两个地方需要注意一下,一个是这个背包需要至少装满n+1的大小,也就是说要注意状态转移和初始化合法状态的问题,第二个就是,有可能买n+k(k>1)张票花的最少钱数会比买n+1张票的的少 #include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,m,k; int x[1010],y[1010]; long long dp[2010]; int main() {     scanf("%d %d %d",&n,&m,&k);     for(int i=0;i<m;i++)     {         scanf("%d %d",&x[i],&y[i]);     }     x[m]=k;     y[m]=1;     m++;     memset(dp,-1,sizeof(dp));     dp[0]=0;     for(int i=0;i<m;i++)     {         for(int j=y[i];j<=n+1002;j++)         {             if(dp[j-y[i]]!=-1)             {                 if(dp[j]==-1)                 {                     dp[j]=dp[j-y[i]]+x[i];                 }                 else if(dp[j-y[i]]+x[i]<dp[j])                 {                     dp[j]=dp[j-y[i]]+x[i];                 }             }         }     }     int ans=dp[n+1002];     for(int i=n+1002;i>=n+1;i--)     {         if(dp[i]<ans)             ans=dp[i];     }     cout<<ans<<endl; }
点赞 回复 分享
发布于 2019-05-15 21:14
大佬 ,我第二题不会,知道是动态规划;麻烦给下思路。第三题是迷宫问题,用回溯,但是我没有调试出来
点赞 回复 分享
发布于 2019-05-15 21:12
第一题,统计矩形区域内的星星数量,100000次询问 二维树状数组的模板题 直接上代码 #include<cstdio> int tree[5555][5555]; int n,m; int x1,y1,x2,y2; int lowbit(int x) {     return x&(-x); } void add(int x,int y,int val) {     while(x<=1000)     {         for(int i=y;i<=1000;i+=lowbit(i))         {             tree[x][i]+=val;         }         x+=lowbit(x);     } } int sum(int x,int y) {     int res=0;     while(x>0)     {         for(int i=y;i>0;i-=lowbit(i))         {             res+=tree[x][i];         }         x-=lowbit(x);     }     return res; } int query(int x1,int y1,int x2,int y2) {     return sum(x2,y2)+sum(x1-1,y1-1)-sum(x2,y1-1)-sum(x1-1,y2); } int main() {     scanf("%d",&n);     for(int i=0;i<n;i++)     {         scanf("%d %d",&x1,&y1);         add(x1,y1,1);     }     scanf("%d",&m);     for(int i=0;i<m;i++)     {         scanf("%d %d %d %d",&x1,&y1,&x2,&y2);         printf("%d\n",query(x1,y1,x2,y2));     } }
点赞 回复 分享
发布于 2019-05-15 21:10

相关推荐

不愿透露姓名的神秘牛友
07-16 18:03
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务