zoukankan      html  css  js  c++  java
  • 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];
        }
    };
    个性签名:时间会解决一切
  • 相关阅读:
    tp5的 LayUI分页样式实现
    BSBuDeJie_05
    WCF 程序入门
    iOS Xcode 调试技巧
    Visual Studio 2015 如何将全英界面转成中文
    BSBuDeJie_04
    BSBuDeJie_03
    BSBuDeJie_02
    BSBuDeJie_01
    iOS 一些琐碎的知识点
  • 原文地址:https://www.cnblogs.com/lfri/p/14566472.html
Copyright © 2011-2022 走看看