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];
    }
};

 

posted @ 2021-03-22 16:15  Rogn  阅读(51)  评论(0编辑  收藏  举报