更改网站名称,做网站建设的销售怎么样,泰安网约车,网站截图环境 php1.题目#xff1a;
给你一个整数数组 rewardValues#xff0c;长度为 n#xff0c;代表奖励的值。
最初#xff0c;你的总奖励 x 为 0#xff0c;所有下标都是 未标记 的。你可以执行以下操作 任意次 #xff1a;
从区间 [0, n - 1] 中选择一个 未标记 的下标 i。如果…1.题目
给你一个整数数组 rewardValues长度为 n代表奖励的值。
最初你的总奖励 x 为 0所有下标都是 未标记 的。你可以执行以下操作 任意次
从区间 [0, n - 1] 中选择一个 未标记 的下标 i。如果 rewardValues[i] 大于 你当前的总奖励 x则将 rewardValues[i] 加到 x 上即 x x rewardValues[i]并 标记 下标 i。
以整数形式返回执行最优操作能够获得的 最大 总奖励。
示例 1
输入rewardValues [1,1,3,3]
输出4
解释
依次标记下标 0 和 2总奖励为 4这是可获得的最大值。
示例 2
输入rewardValues [1,6,4,3,2]
输出11
解释
依次标记下标 0、2 和 1。总奖励为 11这是可获得的最大值。 提示
1 rewardValues.length 5 * 1041 rewardValues[i] 5 * 104 该作者解决方法
不知道C语言要怎么建构bitset看了其他人的解答后尝试用位运速加速。 假设有一个 bool 数组 dp。在每一次循环中dp[rewardValues[i] j] 可以由 dp[j] 转移而来其中 j 为小于 rewardValues[i] 的非负整数。 为了加速运算并减少空间浪费可以将 bool 数组改成 unsigned long long。 在C语言中虽 bool 使用1bit但最小寻址单位为1字节所以占用1字节。 现在我们将数组声明成 unsigned long long此时每次操作最多可以操作64个位元也就是64个状态。 由于 rewardValues[i] 不一定为64的倍数为了避免发生溢位的状况必须将 dp[j] 所代表的64位元拆成两部分。 为了计算正确的下标我们把 rewardValues[i] 用 index 与 digit 表示其中 rewardValues[i] 64 * index digit index rewardValues[i] / 64 digit rewardValues[i] % 64 因此对于每个下标 jdp[j] 可拆成 (dp[j] ((1 (64 - digit)) - 1)) digit dp[j] (64 - digit) 假设 rewardValues[i] 65那么 index 65 / 64 1 digit 65 % 64 1 以 dp[0] 的 0 ~ 63 位为例0 ~ 62 位可以移到 dp[index 0] 中的 1 ~ 63 位对应数字 65 ~ 127。而剩下的1个位则放入 dp[index 1] 的第 0 位这个过程通过或运算即可。 dp[index j] | (dp[j] ((1 (64 - digit)) - 1)) digit; dp[index j 1] | dp[j] (64 - digit); 若 rewardValues[i] 为 64 的倍数可直接转移不需拆分 代码
int cmp(const void *a, const void *b)
{return *(int*)a *(int*)b;
}int maxTotalReward(int* rewardValues, int rewardValuesSize)
{qsort(rewardValues, rewardValuesSize, sizeof(int), cmp);int size rewardValues[rewardValuesSize - 1] / 32 2;unsigned long long dp[size], temp, mask;memset(dp, 0, sizeof(unsigned long long) * size);int index, digit;dp[0] 1;for (int i 0; i rewardValuesSize; i) {index rewardValues[i] / 64;digit rewardValues[i] % 64;mask digit ? (1ULL (64 - digit)) - 1 : 0;for (int j 0; j index; j){if (digit) {dp[j index] | (dp[j] mask) digit;dp[j index 1] | dp[j] (64 - digit);} else {dp[j index] | dp[j];}}if (digit) {temp dp[index] ((1ULL digit) - 1);dp[2 * index] | (temp mask) digit;dp[2 * index 1] | temp 64 - digit;}}for (int i size - 1; i 0; --i) {if (dp[i])return 64 * i 63 - __builtin_clzll(dp[i]);}return 0;
}声明来源力扣题解
作者borane
链接https://leetcode.cn/problems/maximum-total-reward-using-operations-ii/solutions/2805771/01bei-bao-wei-yun-suan-by-modest-nashdn2-svmq/
来源力扣LeetCode