网易游戏雷火盘古招聘题(一)
[编程题]赛马
在一条无限长的跑道上,有N匹马在不同的位置上出发开始赛马。当开始赛马比赛后,所有的马开始以自己的速度一直匀速前进。每匹马的速度都不一样,且全部是同样的均匀随机分布。在比赛中当某匹马追上了前面的某匹马时,被追上的马就出局。 请问按以上的规则比赛无限长的时间后,赛道上剩余的马匹数量的数学期望是多少
输入描述:
每个测试输入包含1个测试用例输入只有一行,一个正整数N1 <= N <= 1000
输出描述:
输出一个浮点数,精确到小数点后四位数字,表示剩余马匹数量的数学期望
输入例子:
1
2
输出例子:
1.0000 1.5000
思路:
对于最后一匹马而言, 它没有办法被其他马追上(因为它后面已经没马了),所以它不会出局,他存活的概率就是1,对于倒数第二匹而言,他只有被后面1匹马追上,或者不被追上 所以是1/2,同理,倒数第三匹1/3…………所以n匹马就是1/1+1/2+1/3+1/4+………+1/n.。
代码实现(C/C++):
代码实现(C/C++):
#include <iostream>
在一条无限长的跑道上,有N匹马在不同的位置上出发开始赛马。当开始赛马比赛后,所有的马开始以自己的速度一直匀速前进。每匹马的速度都不一样,且全部是同样的均匀随机分布。在比赛中当某匹马追上了前面的某匹马时,被追上的马就出局。 请问按以上的规则比赛无限长的时间后,赛道上剩余的马匹数量的数学期望是多少
输入描述:
每个测试输入包含1个测试用例输入只有一行,一个正整数N1 <= N <= 1000
输出描述:
输出一个浮点数,精确到小数点后四位数字,表示剩余马匹数量的数学期望
输入例子:
1
2
输出例子:
1.0000 1.5000
思路:
对于最后一匹马而言, 它没有办法被其他马追上(因为它后面已经没马了),所以它不会出局,他存活的概率就是1,对于倒数第二匹而言,他只有被后面1匹马追上,或者不被追上 所以是1/2,同理,倒数第三匹1/3…………所以n匹马就是1/1+1/2+1/3+1/4+………+1/n.。
代码实现(C/C++):
#include <iostream>
#include <iomanip> //使用小数格式控制时使用的头文件
using namespace std;
int main(){
double sum = 0;
int n;
cin >> n;
for(int i=1; i<=n; i++){
sum += 1*1.0/i;
}
//fixed << setprecision(i) 用来控制 小数点后面的位数,i为具体的位数
//fixed << setprecision(i) 用来控制 小数点后面的位数,i为具体的位数
cout << fixed << setprecision(4) << sum;
return 0;
}
[编程题]字符串编码
给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”。比如字符串AAAABCCDAA会被编码成
4A1B2C1D2A。
输入描述:
每个测试输入包含1个测试用例每个测试用例输入只有一行字符串,字符串只包括大写英文字母,长度不超过10000。
输出描述:
输出编码后的字符串
输入例子:
AAAABCCDAA
输出例子:
4A1B2C1D2A
思路:
解题的着眼点在于每2个字母是否相同,根据这个实现思路有很多,其实最简洁的的应该是用正则表达式,我用的比较笨的方法。。。4A1B2C1D2A。
输入描述:
每个测试输入包含1个测试用例每个测试用例输入只有一行字符串,字符串只包括大写英文字母,长度不超过10000。
输出描述:
输出编码后的字符串
输入例子:
AAAABCCDAA
输出例子:
4A1B2C1D2A
思路:
代码实现(C/C++):
#include <iostream>
#include <string.h>
using namespace std;
void tihuan(char c[] );
int main()
{
//string s;
char * s = new char[2048];
cin >> s;
tihuan(s);
}
void tihuan(char c[])
{
int j=1;
for(int i=0; i<= strlen(c); i++)
{
char a = c[i];
char b = c[i+1];
if(a!=b && i != strlen(c))
{
cout << j << a;
j=0;
}
j++;
}
}
[编程题]最大和
[编程题]最大和
在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值
输入描述:
每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D :3 <= N <= 1001 <= D <= N接下来有N行,每行N个数字d:0 <= d
<= 100
输出描述:
输出一个整数,表示找到的和的最大值
输入例子:
4 2
87 98 79 61
10 27 95 70
20 64 73 29
71 65 15 0
输出例子:
193
思路:
一种简单粗暴一个一个遍历,另一种是递归。下面是我照的网上一个人写的递归算法
代码实现(C/C++): 输入描述:
每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D :3 <= N <= 1001 <= D <= N接下来有N行,每行N个数字d:0 <= d
<= 100
输出描述:
输出一个整数,表示找到的和的最大值
输入例子:
4 2
87 98 79 61
10 27 95 70
20 64 73 29
71 65 15 0
输出例子:
193
思路:
一种简单粗暴一个一个遍历,另一种是递归。下面是我照的网上一个人写的递归算法
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <stack>
using namespace std;
int ans;
int n,d;
int a[104][104];
void dfs(int sum,int cnt,int x,int y,int op){
sum += a[x][y];
cnt += 1;
if (cnt == d) ans = max(ans,sum);
else if (op == 1) dfs(sum,cnt,x+1,y,op);
else if (op == 2) dfs(sum,cnt,x,y+1,op);
else if (op == 3) dfs(sum,cnt,x+1,y+1,op);
else if (op == 4) dfs(sum,cnt,x-1,y+1,op);
}
int main(){
cin >> n >> d;
ans = 0;
for (int i=1; i<=n; ++i) for (int j=1; j<=n;++j) cin >> a[i][j];
for (int i=1; i<=n; ++i) for (int j=1; j<=n;++j) {
if (i + d - 1 <= n) dfs(0,0,i,j,1);
if (j + d - 1 <= n) dfs(0,0,i,j,2);
if (i + d - 1 <= n && j + d - 1 <= n) dfs(0,0,i,j,3);
if (i - d + 1 >= 1 && j + d - 1 <= n) dfs(0,0,i,j,4);
}
cout << ans << endl;
return 0;
}
[编程题]推箱子
大家一定玩过“推箱子”这个经典的游戏。具体规则就是在一个N*M的地图上,有1个玩家、1个箱子、1个目的地以及若干障碍,其余是空地
。玩家可以往上下左右4个方向移动,但是不能移动出地图或者移动到障碍里去。如果往这个方向移动推到了箱子,箱子也会按这个方向移 动一格,当然,箱子也不能被推出地图或推到障碍里。当箱子被推到目的地以后,游戏目标达成。现在告诉你游戏开始是初始的地图布局, 请你求出玩家最少需要移动多少步才能够将游戏目标达成。 输入描述: 每个测试输入包含1个测试用例第一行输入两个数字N,M表示地图的大小。其中0<N,M<=8。接下来有N行,每行包含M个字符表示该行地
图。其中 . 表示空地、X表示玩家、*表示箱子、#表示障碍、@表示目的地。每个地图必定包含1个玩家、1个箱子、1个目的地。
输出描述:
输出一个数字表示玩家最少需要移动多少步才能将游戏目标达成。当无论如何达成不了的时候,输出-1。
输入例子:
4 4
....
..*@
.... .X.. 6 6. ..#... .....# *##... .##.#. .X.... @#...
输出例子:
3 11
思路:
代码实现(C/C++): 。。。。。。。我也不会 等我研究完再说。
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
int n,m,x1,x2,x3,y1,y2,y3;
char map[10][10],flag[8][8][8][8];
int value[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int ABS(int a){
return a>=0?a:-a;
}
struct node{
int x,y,a,b,t;
bool operator < (const node &temp) const {
return t+ABS(a-x3)+ABS(b-y3) > temp.t+ABS(temp.a-x3)+ABS(temp.b-y3);
}
};
int BFS(){
int i;
node temp1,temp2;
priority_queue<node> q;
temp1.x = x1;
temp1.y = y1;
temp1.a = x2;
temp1.b = y2;
temp1.t = 0;
flag[temp1.x][temp1.y][temp1.a][temp1.b] = 1;
q.push(temp1);
while(!q.empty()){
temp1 = q.top();
q.pop();
temp2.t = temp1.t+1;
for(i=0;i<4;i++){
temp2.a = temp1.a;
temp2.b = temp1.b;
temp2.x = temp1.x+value[i][0];
temp2.y = temp1.y+value[i][1];
if(temp2.x>=0 && temp2.x<m && temp2.y>=0 && temp2.y<n && map[temp2.y][temp2.x] != '#'){
if(temp2.x == temp2.a && temp2.y == temp2.b){
if(i == 0){
temp2.a++;
}
else if(i == 1){
temp2.a--;
}
else if(i == 2){
temp2.b++;
}
else{
temp2.b--;
}
if(!(temp2.a>=0 && temp2.a<m && temp2.b>=0 && temp2.b<n && map[temp2.b][temp2.a] != '#')) continue;
}
if(temp2.a == x3 && temp2.b == y3) return temp2.t;
if(flag[temp2.x][temp2.y][temp2.a][temp2.b]) continue;
flag[temp2.x][temp2.y][temp2.a][temp2.b] = 1;
q.push(temp2);
}
}
}
return -1;
}
int main(){
int i,j;
cin>>n>>m;
for(i=0;i<n;i++) cin>>map[i];
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(map[i][j] == 'X'){
x1 = j;
y1 = i;
}
if(map[i][j] == '*'){
x2 = j;
y2 = i;
}
if(map[i][j] == '@'){
x3 = j;
y3 = i;
}
}
}
memset(flag,0,sizeof(flag));
cout<<BFS()<<endl;
return 0;
}
|