楼主: 22691482
跳转到指定楼层
上一主题 下一主题
收起左侧

Google on campus

🔗
averillzheng 2014-11-4 11:30:33 | 只看该作者
全局:
22691482 发表于 2014-11-4 11:20
请看14楼,这不是最优解。

这个思路是对的。
和你说的思路不一样。
直接sample 一个random number  between 0 to (max - badNum.length)。
然后开始查。

回复

使用道具 举报

🔗
averillzheng 2014-11-4 11:35:26 | 只看该作者
全局:
22691482 发表于 2014-11-4 11:28
怎么确定maxPick里面是存的Player1还是Player2的信息?

maxPick存的都是player1能得到的最大值。
比如maxPick【i】【j】 就是表示如果我们只有arr 的从i 到 j 的segment。 player1 能得到的最大的值。
回复

使用道具 举报

🔗
 楼主| 22691482 2014-11-4 12:51:22 | 只看该作者
全局:
averillzheng 发表于 2014-11-4 11:30
这个思路是对的。
和你说的思路不一样。
直接sample 一个random number  between 0 to (max - badNum. ...

噢噢噢噢  我在14楼回复里面也提到了这个思路,, 是中间的某部。
回复

使用道具 举报

🔗
 楼主| 22691482 2014-11-4 12:53:08 | 只看该作者
全局:
averillzheng 发表于 2014-11-4 11:35
maxPick存的都是player1能得到的最大值。
比如maxPick【i】【j】 就是表示如果我们只有arr 的从i 到 j  ...

你好,

在19楼, 你提到:
“player1 已经取了arr【i】 或者arr【j】。.
这样player1 就变成了player2. 而原来的player2 就变成了player1.”

如果maxPick存的都是Player1的信息,怎么变到Player2?
回复

使用道具 举报

🔗
csgtc 2014-11-4 13:29:46 | 只看该作者
全局:
random那道题我去年Google oncampus面过,主要是考虑等概率
回复

使用道具 举报

🔗
 楼主| 22691482 2014-11-4 13:43:38 | 只看该作者
全局:
csgtc 发表于 2014-11-4 13:29
random那道题我去年Google oncampus面过,主要是考虑等概率

所以鸡精还是叼
回复

使用道具 举报

🔗
王可雪 2014-11-4 14:47:28 | 只看该作者
全局:
22691482 发表于 2014-11-4 11:20
思路是这样。。问题是怎么写出可以跑的代码。。

没考虑太多cases,不一定对。不过倒是提醒我了,对付游戏minimax是比较常用的思路。为了感谢lz分享面经,我贴一下我的代码,要是有没考虑到的,欢迎大家指正。
  1. #include <iostream>
  2. #include <assert.h>
  3. #include <algorithm>
  4. using namespace std;

  5. int coinGame(int array[], int n) {
  6.         assert(n > 0);
  7.         if (n == 1)
  8.                 return array[0];
  9.         int start = 0;
  10.         int end = n - 1;
  11.         int sum = 0;
  12.         for (; start < end; start++, end--) {
  13.                 if (end - start == 1)
  14.                         sum += max(array[start], array[end]);
  15.                 else if (end - start == 2) {
  16.                         sum += max(array[start], array[end]) + array[start+1];
  17.                         break;
  18.                 }
  19.                 else {
  20.                         sum += (min(array[start] - array[start+1], array[start]-array[end]),
  21.                                 min(array[end] - array[end-1], array[end]-array[start]))
  22.                                 ? array[start] : array[end];
  23.                 }
  24.         }
  25.         return sum;
  26. }

  27. int main() {
  28.         int test1[] = {50, 100, 1, 49};
  29.         cout << coinGame(test1, 4) << endl;
  30. }
复制代码

补充内容 (2014-11-4 14:48):
我这里assume的永远玩家先手
回复

使用道具 举报

🔗
 楼主| 22691482 2014-11-4 14:49:44 | 只看该作者
全局:
王可雪 发表于 2014-11-4 14:47
没考虑太多cases,不一定对。不过倒是提醒我了,对付游戏minimax是比较常用的思路。为了感谢lz分享面经, ...

厉害厉害,,我当时想的是我在写minmax作业的时候实现起来很麻烦,面试现场写出来会有很多bug,就没现场写了。。
回复

使用道具 举报

🔗
王可雪 2014-11-4 15:04:19 | 只看该作者
全局:
王可雪 发表于 2014-11-4 14:47
没考虑太多cases,不一定对。不过倒是提醒我了,对付游戏minimax是比较常用的思路。为了感谢lz分享面经, ...

上面的代码有点错误。
  1. #include <iostream>
  2. #include <assert.h>
  3. #include <algorithm>
  4. using namespace std;

  5. int coinGame(int array[], int n) {
  6.         assert(n > 0);
  7.         if (n == 1)
  8.                 return array[0];
  9.         int start = 0;
  10.         int end = n - 1;
  11.         int sum = 0;
  12.         for (; start < end;) {
  13.                 if (end - start == 1) {
  14.                         sum += max(array[start], array[end]);
  15.                         break;
  16.                 }
  17.                 else if (end - start == 2) {
  18.                         sum += max(array[start], array[end]) + array[start+1];
  19.                         break;
  20.                 }
  21.                 else {
  22.                         //cout << array[end] - array[end-1] << endl;
  23.                         sum += (min(array[start] - array[start+1], array[start]-array[end]) >
  24.                                 min(array[end] - array[end-1], array[end]-array[start]))
  25.                                 ? array[start++] : array[end--];
  26.                         //cout << end << endl;
  27.                         min(array[start] - array[start+1], array[start]-array[end]) >
  28.                         min(array[end] - array[end-1], array[end]-array[start]) ? start++ : end--;
  29.                         //cout << end << endl;               
  30.                 }
  31.         }
  32.         return sum;
  33. }

  34. int main() {
  35.         int test1[] = {50, 100, 1000, 49};
  36.         int test2[] = {50, 100, 1, 49};
  37.         cout << coinGame(test1, 4) << endl;
  38.         cout << coinGame(test2, 4) << endl;

  39. }
复制代码
回复

使用道具 举报

🔗
王可雪 2014-11-4 15:06:41 | 只看该作者
全局:
22691482 发表于 2014-11-4 14:49
厉害厉害,,我当时想的是我在写minmax作业的时候实现起来很麻烦,面试现场写出来会有很多bug,就没现场 ...

那你用什么写的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表