2016网易内推笔试编程题合集(一)

[编程题] 合唱团 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗? 
输入描述:
每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包含 n 个整数,按顺序表示每个学生的能力值 ai(-50 <= ai <= 50)。接下来的一行包含两个整数,k 和 d (1 <= k <= 10, 1 <= d <= 50)。

输出描述:
输出一行表示最大的乘积。
输入例子:
3 7 4 7 2 50
输出例子:
49 分析:dp。由于本题求的是乘积最大,而且数据存在负数,那么就需要存储最大值以及最小值。dp[i][j] 表示选第 i 个学生作为第 j 个备选人,mins存最小值,maxs存最大值。

代码清单:

#include 
#include 
#include 
#include 
using namespace std;const int maxn = 50 + 5;
const long long minn = -1e17;struct DP {long long mins;long long maxs;
}dp[maxn][15];int n;
int a[maxn];
int k, d;void input() {for(int i = 1; i <= n; ++i) {scanf("%d", &a[i]);}scanf("%d%d", &k, &d);
}void solve() {memset(dp, 0, sizeof(dp));for(int i = 1; i <= n; ++i) dp[i][1].mins = dp[i][1].maxs = a[i];long long ans = minn;for(int i = 1; i <= n; ++i) {for(int ki = 2; ki <= k; ++ki) {int j = i - d;if(j <= 0) j = 1;for(; j < i; ++j) {dp[i][ki].mins = min(dp[i][ki].mins, min(dp[j][ki - 1].mins * a[i], dp[j][ki - 1].maxs * a[i]));dp[i][ki].maxs = max(dp[i][ki].maxs, max(dp[j][ki - 1].mins * a[i], dp[j][ki - 1].maxs * a[i]));}}}for(int i = 1; i <= n; ++i) {ans = max(ans, dp[i][k].maxs);}printf("%lld\n", ans);
}int main() {while(scanf("%d", &n) != EOF) {input();solve();}return 0;
}

[编程题] 地牢逃脱 给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x 0 , y 0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。 
输入描述:
每个输入包含 1 个测试用例。每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 50),表示地牢的长和宽。接下来的 n 行,每行 m 个字符,描述地牢,地牢将至少包含两个 '.'。接下来的一行,包含两个整数 x0, y0,表示牛牛的出发位置(0 <= x0 < n, 0 <= y0 < m,左上角的坐标为 (0, 0),出发位置一定是 '.')。之后的一行包含一个整数 k(0 < k <= 50)表示牛牛合法的步长数,接下来的 k 行,每行两个整数 dx, dy 表示每次可选择移动的行和列步长(-50 <= dx, dy <= 50)

输出描述:
输出一行一个数字表示最坏情况下需要多少次移动可以离开地牢,如果永远无法离开,输出 -1。以下测试用例中,牛牛可以上下左右移动,在所有可通行的位置.上,地牢出口如果被设置在


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部