leetcode 第 48 场双周赛
第三题:1798. 你能构造出连续值的最大数目
思路:就是找到最小的不能被表示的整数
贪心,如果$[0, sum_{i}]$ 都能被表示出来,若$a_{i+1} > sum_{i}$,则$sum_i + 1$就不能被表示;若$a_{i+1} <= Sum_{i}$,则 $[0, Sum_{i+1}]$ 都能被表示;
所以,遍历,判断每一个 $a_i$ 即可。
class Solution { public: int getMaximumConsecutive(vector<int>& coins) { sort(coins.begin(), coins.end()); int sum = 0; for(auto x : coins) { if(x > sum+1) return sum+1; sum += x; } return sum+1; } };
第四题:1799. N 次操作后的最大分数和
思路:基本的状压DP,$dp[i] = max(dp[i], dp[i - (1<<j) - (1<<k)] + score)$
class Solution { public: int gcd(int a, int b) { return b==0 ? a : gcd(b, a%b); } int maxScore(vector<int>& nums) { int n = nums.size(); vector<int>dp(1<<n, 0); for(int i = 0;i < (1 << n);i++) { int cnt = 0; for(int j = 0;j < n;j++) if(i & (1<<j)) cnt++; if(cnt%2) continue; for(int j = 0;j < n;j++) for(int k = j+1;k < n;k++) if(((i>>j)&1) == 1 && ((i>>k)&1) == 1) { // cout << i << " " << i-(1<<j)-(1<<k) << endl; dp[i] = max(dp[i], dp[i-(1<<j)-(1<<k)] + gcd(nums[j], nums[k]) * ((n-cnt)/2+1)); } } return dp[(1<<n)-1]; } };
个性签名:时间会解决一切