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];
        }
    };
    个性签名:时间会解决一切
  • 相关阅读:
    Directory类的使用、Alt+Shift+F10可以查看其命名空间
    用户控件
    图像检测算法Halcon 10的使用
    MD5加密的使用
    AppDomain.CurrentDomain.AssemblyResolve
    记事本程序
    C#文件操作
    部分常用控件
    TreeView的使用
    ComboBox的使用
  • 原文地址:https://www.cnblogs.com/lfri/p/14566472.html
Copyright © 2011-2022 走看看