爱奇艺算法岗笔试编程题

1.输入N,然后 输入大小为N-1的数组A,只包含0和1;现在对1到N的元素进行排序得到数组P,要求:
如果 对所有A[i]=0, 有P[i] < P[i+1]; 所有A[i]=1, P[i] > P[i+1].
这样的排列是一个有效的排列,找到符合要求的有效排序的个数。输出排列个数对 (10^9+7)的模。
#include <iostream>
#include<math.h>
#include<vector>
#include<algorithm>
using namespace std;

bool isValidPerm(vector<int>& perms, vector<int>& standards) {
	for (int i = 0; i < standards.size(); i++) {
		if (standards[i] == 0) {
			if (perms[i] >= perms[i + 1])
				return false;
		}
		else if(standards[i] == 1) {
			if (perms[i] <= perms[i + 1])
				return false;
		}
	}
	return true;
}

void numberOfPermutations() {
	int N;
	cin >> N;
	long long cnt = N-1;
	int val;
	vector<int> standards, perms;
	while (cnt--) {
		cin >> val;
		standards.push_back(val);
	}
	cnt = 1;
	while (cnt <= N) {
		perms.push_back(cnt);
		cnt++;
	}
	cnt = 0;
	do {
		if (isValidPerm(perms, standards))
			cnt++;
	} while (next_permutation(perms.begin(), perms.end()));

	cout << (cnt % static_cast<long long>(pow(10.0, 9) + 7)) << endl;
}

int main() {
	numberOfPermutations();
	return 0;
}

2.有n个红球和m个蓝球,A,B,C三个人,轮流不放回的取出一个球。若A取到红球则A胜利,若B取到红球则B胜利,C只负责取球捣乱,不参与胜负。若最后全部球取完后A没有拿到 红球,则B胜利,求A胜利的概率。
输入:m,n
输出:A胜利的概率,保留5位小数(补零)
#include <iostream>
#include <iomanip>
using namespace std;

double res = 0;
void winProbality(double m, double n, double& lastRoundNotWin) {
	if (m + n <= 0) return;
	if (m < 0 || n < 0) return;

	double total = m + n;
	double curRoundWin = 0;
	curRoundWin = lastRoundNotWin * (double(n) / total); //当前这轮胜利
	res += curRoundWin;

	lastRoundNotWin = m / total * (--m / --total); //A没赢,B没赢
	double dir1 = lastRoundNotWin * (m - 1) / (total - 1);//C选了m
	winProbality(m - 1, n, dir1);

	double dir2 = lastRoundNotWin * n / (total - 1); //C选了n
	winProbality(m, n - 1, dir2);
}
void solution() {

	double m, n;
	cin >> m >> n; // blue red

	double lastRoundNotWin = 1;
	res = 0;
	winProbality(m, n, lastRoundNotWin);

	cout.setf(ios::fixed);
	cout << fixed << setprecision(5) << res << endl;
}

int main() {
	solution();
	return 0;
}

第一题AC 36%,第二题AC 9%,大佬能否告诉下问题出在哪???

#爱奇艺##笔试题目##题解##算法工程师#
全部评论
第一题 leetcode 903
点赞 回复 分享
发布于 2019-09-08 17:35
第二题AC了,就是一个模拟的过程,f[n][m]表示n个红球m个蓝球是A获胜的概率,然后转移到f[n][m-3]或者f[n-1][m-2],分别乘上两者对应的概率即完事。
点赞 回复 分享
发布于 2019-09-09 08:38
第一题超时啊…我第一题也是ac36,它是内存超了
点赞 回复 分享
发布于 2019-09-09 08:52
我VS上测试用例能过,但leetcode却提示溢出出错了,有人遇到这种情况吗
点赞 回复 分享
发布于 2019-09-08 19:58
第一题既然都取模了,暴力肯定过不了啊😂
点赞 回复 分享
发布于 2019-09-08 19:05
第二题过了91%  int main() {     int n = 0, m = 0; // red blue     cin >> n >> m;     vector<vector<double>> dp(n + 1, vector<double>(m + 1, 0));     for (int j = 0; j <= m; ++j) {         dp[0][j] = 0;     }     for (int i = 0; i <= n; ++i) {         dp[i][0] = 1;         dp[i][1] = i / (i + 1.0);     }     for (int i = 1; i <= n; ++i) {         for (int j = 2; j <= m; ++j) {             double ns = i, ms = j;             double all = i + j;             double res = (ns) / all;             if (j >= 3) {                 dp[i][j] = res + (ms / all) * (ms - 1) / (all - 1) *                        ((ms - 2) / (all - 2) * dp[i][j - 3] + (ns / (all - 2)) * dp[i - 1][j - 2]);             } else if (j == 2) {                 dp[i][j] = res + (ms / all) * ((ms - 1) / (all - 1)) * (ns / (all - 2)) * dp[i - 1][j - 2];             }         }     }     cout << setiosflags(ios::fixed) << setprecision(5) << dp[n][m];     return 0; }
点赞 回复 分享
发布于 2019-09-08 17:44
可能是超时了
点赞 回复 分享
发布于 2019-09-08 17:34
第一题我最开始也想暴力全排列再判断,但是超时了🤣只能36
点赞 回复 分享
发布于 2019-09-08 17:33
开发岗也是这两道题
点赞 回复 分享
发布于 2019-09-08 17:28
我第一题也是36……不知道咋回事,感觉没问题啊😂
点赞 回复 分享
发布于 2019-09-08 17:23

相关推荐

用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
评论
1
16
分享

创作者周榜

更多
牛客网
牛客企业服务