2016网易内推笔试编程题合集(一)
[编程题] 合唱团 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
输入描述:
输出描述:
输入例子:
输出例子:
代码清单:
#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 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。
输入描述:
输出描述:
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
