Edu144 CD

Dashboard - Educational Codeforces Round 144 (Rated for Div. 2) - Codeforces

C. Maximum Set

思路:要想让集合长度最长,显然令倍数为2,那么可以容易得到最长长度为 l o g 2 ( r / l ) + 1 log2(r/l)+1 log2(r/l)+1。

接下来求个数,首先是所有倍数都为2的集合,上界为 u p = r / ( 1 l l < < c i ) up = r / (1ll << ci) up=r/(1ll<<ci), a n s 1 = ( u p − l + 1 ) ans1=(up - l + 1) ans1=(up−l+1)。

其次可以令一个2变成3,比如第四个样例,4 8 16 32 64--->>>4 12 24 48 96。第二个位置2变3。

我们求出这种情况的上界 u p 1 = r / ( 1 l l < < ( c i − 1 ) ) / 3 up1 = r / (1ll << (ci - 1)) / 3 up1=r/(1ll<<(ci−1))/3, a n s 2 = ( u p 1 − l + 1 ) ∗ c i ) ans2=(up1 - l + 1) * ci) ans2=(up1−l+1)∗ci)。

然后如果两个2变成3或者一个2变成4,都会导致长度变短所以不可行。

所以最终答案 a n s = ( a n s 1 + a n s 2 ) ans=(ans1+ans2)%mod ans=(ans1+ans2)。

cpp 复制代码
void solve()
{
    int l, r;
    cin >> l >> r;
    int len = log2(r / l) + 1;
    int ci = log2(r / l);//2的个数
    int up = r / (1ll << ci); // 第一个上界
    ans = 0;
    ans += (up - l + 1);
    /* cout << up << ' '; */
    int up1 = r / (1ll << (ci - 1)) / 3; // 第二个上界
    if (up1 - l + 1 > 0)
    {
        ans = (ans + (up1 - l + 1) * ci) % mod; //*ci是因为这种情况所有的2都可以变成3
    }
    cout << len << ' ' /*  << up << ' ' << x << ' ' */;
    cout << ans;
}

D. Maximum Subarray

思路:题目要求k个数+x,其他数-x。我们可以先令所有数-x,再选k个数+2*x。

我们考虑 d p [ i ] [ j ] dp[i][j] dp[i][j] 为前i个数选了j个数,容易得到转移方程:

d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] + a [ i ] , d p [ i − 1 ] [ j − 1 ] + a [ i ] + x ∗ 2 , 0 l l ) dp[i][j]=max(dp[i-1][j]+a[i],dp[i-1][j-1]+a[i]+x*2,0ll) dp[i][j]=max(dp[i−1][j]+a[i],dp[i−1][j−1]+a[i]+x∗2,0ll) 。

cpp 复制代码
void solve()
{
    cin >> n >> k >> x;
    rep(1, i, n)
    {
        cin >> a[i];
        a[i] -= x;
    }
    rep(0, i, n)
    {
        rep(i + 1, j, k)
        {
            dp[i][j] = -1e18;
        }
    }
    ans = 0;
    rep(1, i, n)
    {
        rep(0, j, min(i, k))
        {
            if (j)
            {
                dp[i][j] = max({dp[i - 1][j] + a[i], dp[i - 1][j - 1] + a[i] + 2 * x, 0ll});
            }
            else
            {
                dp[i][j] = max(dp[i - 1][j] + a[i], 0ll);
            }
        }
    }
    rep(1, i, n)
    {
        rep(0, j, min(i, k))
        {
            if (k - j <= n - i) //注意确保没选的k的个数要小于等于当前未选的总数
            {
                ans = max(ans, dp[i][j]);
            }
        }
    }
    cout << ans;
}
相关推荐
君义_noip7 小时前
信息学奥赛一本通 1661:有趣的数列 | 洛谷 P3200 [HNOI2009] 有趣的数列
c++·算法·组合数学·信息学奥赛·csp-s
程序员:钧念7 小时前
深度学习与强化学习的区别
人工智能·python·深度学习·算法·transformer·rag
英英_8 小时前
MATLAB数值计算基础教程
数据结构·算法·matlab
一起养小猫8 小时前
LeetCode100天Day14-轮转数组与买卖股票最佳时机
算法·leetcode·职场和发展
hele_two9 小时前
快速幂算法
c++·python·算法
OopspoO9 小时前
C++杂记——Name Mangling
c++
yuanmenghao9 小时前
车载Linux 系统问题定位方法论与实战系列 - 车载 Linux 平台问题定位规范
linux·运维·服务器·网络·c++
小羊羊Python9 小时前
SoundMaze v1.0.1正式发布!
开发语言·c++
l1t9 小时前
利用DeepSeek将python DLX求解数独程序格式化并改成3.x版本
开发语言·python·算法·数独
jllllyuz9 小时前
基于子集模拟的系统与静态可靠性分析及Matlab优化算法实现
算法·matlab·概率论