c++刷题(37/100)笔试题2

4道题2小时,又是一道,不过此次的比较难,但第二道不该该的,又是审题不仔细致使没过ios

题目1:数组

给定一个字符串,请你将字符串从新编码,将连续的字符替换成“连续出现的个数+字符”。好比字符串AAAABCCDAA会被编码成4A1B2C1D2A。布局

思路:就简单的字符串处理测试

#include <iostream> #include <string> using namespace std ; int main(){ string str , ans ; cin >> str ; ans = "" ; for(int i=0;i<str.length();i++){ int cnt = 1 ; char temp = str[i] ; while((i+1)<str.length()&&temp==str[i+1]){ cnt++ ; i++ ; } ans = ans + to_string(cnt) + temp ; } cout << ans << endl ; }

第二题:this

在一个N*N的数组中寻找全部横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值 编码

输入描述:
每一个测试输入包含1个测试用例,第一行包括两个整数 N 和 D :
3 <= N <= 100
1 <= D <= N
接下来有N行,每行N个数字d:
0 <= d <= 100



输出描述:
输出一个整数,表示找到的和的最大值

 

输入例子1:
4 2
87 98 79 61
10 27 95 70
20 64 73 29
71 65 15 0

 

输出例子1:
193

这道没过不该该了,自觉得题目中的左上到右下和右上到左下是一个意思,而后就少算了一种状况,因而只能过80%的样例,最后有个疑问,既然0<=d<=100,为何还要考虑负数。。spa

#include <iostream> #include <algorithm> using namespace std ; int findMax(vector<vector<int>> map,int x,int y,int D){ int l , d , ld ,rd; int lc, dc, ldc ,rdc ; int m  = 0 ; l = d = ld = rd = 0 ; lc = dc = ldc = rdc = 0 ; for(int i=0;i<D;i++){ if(x+i<map.size()){ d += map[x+i][y] ; dc++ ; } if(y+i<map[0].size()){ l += map[x][y+i] ; lc++ ; } if(x+i<map.size()&&y+i<map[0].size()){ ld += map[x+i][y+i] ; ldc++ ; } if(x+i<map.size()&&y-i>=0){ rd += map[x+i][y-i] ; rdc++ ; } } if(lc!=D) l = 0 ; if(dc!=D) d = 0 ; if(ldc!=D) ld = 0 ; if(rdc!=D) rd = 0 ; m = max(m,l) ; m = max(m,d) ; m = max(m,ld) ; m = max(m,rd) ; return m ; } int main(){ int n , d ; cin >> n ; cin >> d ; vector<vector<int>> map(n,vector<int>(n)) ; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin >> map[i][j] ; } } int ans = 0 ; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ ans = max(ans,findMax(map,i,j,d)) ; } } cout << ans << endl ; }

 题目三:推箱子code

你们必定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其他是空地。玩家能够往上下左右4个方向移动,可是不能移动出地图或者移动到障碍里去。若是往这个方向移动推到了箱子,箱子也会按这个方向移动一格,固然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地之后,游戏目标达成。如今告诉你游戏开始是初始的地图布局,请你求出玩家最少须要移动多少步才可以将游戏目标达成。 blog

输入描述:
每一个测试输入包含1个测试用例
第一行输入两个数字N,M表示地图的大小。其中0<N,M<=8。
接下来有N行,每行包含M个字符表示该行地图。其中 . 表示空地、X表示玩家、*表示箱子、#表示障碍、@表示目的地。
每一个地图一定包含1个玩家、1个箱子、1个目的地。



输出描述:
输出一个数字表示玩家最少须要移动多少步才能将游戏目标达成。当不管如何达成不了的时候,输出-1。

 

输入例子1:
4 4
....
..*@
....
.X..
6 6
...#..
......
#*##..
..##.#
..X...
.@#...

 

输出例子1:
3
11

思路:老实说以为挺难的,并且很久没有作广搜的题了,一开始想着人和箱子分两个阶段,人找到箱子以前和找到箱子以后,然而写的一团乱,反正没写出来,后面看了评论区大神的写法,用一个思惟数组vis[x][y][wx][wy]记录状态人在x,y箱子在wx,wy时须要多少步游戏

以后在中间判断人的移动有没有形成箱子的移动就好了。

#include <iostream> #include <queue> #include <string> using namespace std ; struct State{ int x , y , wx , wy ; State(int x,int y,int wx,int wy){ this->x = x ; this->y = y ; this->wx = wx ; this->wy = wy ; } }; int vis[10][10][10][10] ; int map[10][10] ; int ex, ey, x, y, wx, wy , m , n ; int a[]={0,0,1,-1}, b[]={1,-1,0,0} ; queue<State> q ; int bfs(){ vis[x][y][wx][wy] = 1 ; State s(x,y,wx,wy) ; q.push(s) ; while(!q.empty()){ State t = q.front() ; q.pop() ; if(t.wx==ex&&t.wy==ey) return vis[t.x][t.y][t.wx][t.wy]-1 ; for(int i=0;i<4;i++){ int nx = t.x+a[i] ; int ny = t.y+b[i] ; if(nx<0||ny<0||map[nx][ny]=='#'||nx>=n||ny>=m) continue ; if(nx==t.wx&&ny==t.wy){ int nwx = nx+a[i] ; int nwy = ny+b[i] ; if(nwx<0||nwy<0||map[nwx][nwy]=='#'||nwx>=n||nwy>=m) continue ; if(vis[nx][ny][nwx][nwy]) continue ; vis[nx][ny][nwx][nwy] = vis[t.x][t.y][t.wx][t.wy]+1 ; State s(nx,ny,nwx,nwy) ; q.push(s) ; }else{ if(vis[nx][ny][t.wx][t.wy]) continue ; vis[nx][ny][t.wx][t.wy] = vis[t.x][t.y][t.wx][t.wy]+1 ; State s(nx,ny,t.wx,t.wy) ; q.push(s) ; } } } return -1 ; } int main(){ cin >> n >> m ; for(int i=0;i<n;i++){ string row ; cin >> row ; for(int j=0;j<m;j++){ map[i][j] = row[j] ; if(row[j]=='X'){ x = i ; y = j ; } if(row[j]=='*'){ wx = i ; wy = j ; } if(row[j]=='@'){ ex = i ; ey = j ; } } } cout << bfs() << endl ; }

题目4:赛马

在一条无限长的跑道上,有N匹马在不一样的位置上出发开始赛马。当开始赛马比赛后,全部的马开始以本身的速度一直匀速前进。每匹马的速度都不同,且所有是一样的均匀随机分布。在比赛中当某匹马追上了前面的某匹马时,被追上的马就出局。 请问按以上的规则比赛无限长的时间后,赛道上剩余的马匹数量的数学指望是多少 

输入描述:
每一个测试输入包含1个测试用例
输入只有一行,一个正整数N
1 <= N <= 1000



输出描述:
输出一个浮点数,精确到小数点后四位数字,表示剩余马匹数量的数学指望

 

输入例子1:
1
2

 

输出例子1:
1.0000
1.5000

思路:算是数学题,然而在时间有限的状况下没想明白。以后看了评论区答案:速度最大的马不管在什么位置均可以不被淘汰,因此速度最大的马存活的几率是1,而后速度第二大的马只有在速度最大的马后面才能存活,只有在它先后两种状况,因此存活的几率是1/2,同理,速度第三大的马有三种排列状况(不考虑前面两匹马的排列),存活几率是1/3,依次类推,因此最后的状况就是1+1/2+1/3+......1/n。注意不是经过每种排列状况计算能存活下来的马的数量,而是根据每匹马能存活的几率计算。

#include <iostream> #include <iomanip>
using namespace std ; int main(){ int n ; double ans  = 0; cin >> n ; for(int i=1;i<=n;i++){ ans+=(1.0/i) ; } cout<<setiosflags(ios::fixed)<<setprecision(4)<<ans<<endl ; }
相关文章
相关标签/搜索