首页 > 其他分享 >Codeforces Round 901 (Div

Codeforces Round 901 (Div

时间:2023-10-01 22:00:11浏览次数:34  
标签:901 对半切 int Codeforces 我们 mp Div mex dp

C. Jellyfish and Green Apple

image-20231001213519664

题解

  • 显然\(n \% m =0\),答案一定为\(0\)

  • 如果\(n > m\),我们显然可以将\(n / m\)的苹果分给每个人,然后再处理$n % m $

  • 如果\(n < m\),我们一定会将所有苹果一直对半切直到\(n > m\),所以答案每次对半切一定会加\(n\)

  • 直到\(n \%m = 0\)的时候结束

  • 那么什么情况下无解呢?

我们考虑每次对半切会使得\(n :=n * 2\),也就是说如果一个质因子\(p,p\neq 2\)在\(m\)中存在,但是在\(n\)中不存在,那么\(n\)不管怎么翻倍,永远不会出现\(n \%m = 0\)

那么这个该如何判断呢?

我们可以通过\(\frac{m}{gcd(n,m)}=2^i\)来判断

int n, m;

int lowbit(int x) { return x & -x; }

void solve()
{
    cin >> n >> m;
    if (n % m == 0)
    {
        cout << 0 << endl;
        return;
    }
    n = n % m;
    int r = m / gcd(n, m);
    if (r != lowbit(r))
    {
        cout << -1 << endl;
        return;
    }
    int ans = 0;
    while (true)
    {
        while (n * 2 < m)
        {
            ans += n;
            n <<= 1;
        }
        ans += n;
        n <<= 1;
        if (n % m == 0)
            break;
        n = n % m;
    }
    cout << ans << endl;
}

D. Jellyfish and Mex

image-20231001214729521

\(1 \leq n \leq 5000\)

题解:\(DP\)

  • 我们考虑\(dp\)

  • 显然对于\(a_i > mex\)部分我们可以不用管

  • 如果当前数组\(a\)的\(mex\)为\(g\),我们想使得\(x,x < g\)成为\(mex\),那么代价为\(g \times (cnt[x] - 1) + x\)

  • 我们定义状态为:\(dp[i]\):代表通过删除操作使得\(mex = i\)的最小代价

  • 转移方程为:

\[dp[mex] = 0 \\ dp[i] = min \sum_{j = i + 1}^{mex}(dp[j] + j \times (cnt[i] - 1) + i) \]

倒序遍历\(i\)即可

  • 显然答案为\(dp[0]\)
int n, a[N];
// dp[i] 代表通过删除操作使得 mex = i 的最小代价

void solve()
{
    cin >> n;
    map<int, int> mp;
    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
        mp[a[i]]++;
    }
    int mex = -1;
    for (int i = 0;; ++i)
        if (!mp.count(i))
        {
            mex = i;
            break;
        }
    vector<int> dp(mex + 10, INF);
    dp[mex] = 0;
    for (int i = mex - 1; i >= 0; --i)
        for (int j = i + 1; j <= mex; ++j)
            dp[i] = min(dp[i], dp[j] + j * (mp[i] - 1) + i);
    cout << dp[0] << endl;
}

标签:901,对半切,int,Codeforces,我们,mp,Div,mex,dp
From: https://www.cnblogs.com/Zeoy-kkk/p/17739338.html

相关文章

  • Codeforces Round 895 (Div. 3)
    A题简单的模拟计算,注意上取整的实现。B题计算每个房间对应的每个最迟时间点,在这些时间点最取最小值,保证能安全通过所有房间。D题拿到手就可以发现是贪心,但发现两部分会有冲突,也就是重复计算的部分。故提前找到两个数的lcm然后不计算lcm的倍数,为其他参与计算的数安排剩余数种的最......
  • Codeforces 1278D 题解
    题目大意题目大意给你\(n\)(\(1\leqslantn\leqslant5\cdot10^5\))条线段\([l_1,r_1],[l_2,r_2],\cdots,[l_n,r_n]\)(\(1\lel_i<r_i\le2n\))。保证每条线段的端点为整数,且\(\foralli,j\)(\(i\nej\)),不存在\(l_i=l_j\)或\(r_i=r_j\),不存......
  • Codeforces Round 811 (Div. 3)
    A.EveryoneLovestoSleep#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,h,m,t;cin>>n>>h>>m;t=h*60+m;vector<int>a;for(inti=1,x,y;i<=n;i++)cin......
  • Codeforces 1702G2 题解
    题目大意给出一个大小为\(n\)的树,\(q\)次询问,每次给出一个大小为\(m\)的点集,判断是否有一条链覆盖这些点(这条链可以经过其他点)。\(n,\summ\leqslant2\cdot10^5\),\(q\leqslant10^5\)。提示提示1思考将$m$个点按深度排序。题解题解考虑将\(m\)个点按树......
  • CodeForces 1874B Jellyfish and Math
    洛谷传送门CF传送门看到这种操作乱七八糟不能直接算的题,可以考虑最短路。对于\(a,b,c,d,m\)按位考虑,发现相同的\((a,b,m)\)无论如何操作必然还是相同的。于是考虑对于每个可能的\((0/1,0/1,0/1)\),所有终态有\((c=0/1,d=0/1)\)或者不确定。这样我们对于一......
  • 「题解」Codeforces Round 895 (Div. 3)
    A.TwoVesselsProblem题目Sol&Code签到题#include<bits/stdc++.h>typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}intT,a,b,c;intmain(){scanf("%d"......
  • AT_abc254_h [ABC254Ex] Multiply or Divide by 2 题解
    打篇题解巩固一下。题意给你两个集合\(A\)和\(B\),对于任意\(A\)集合中的元素,我们可以进行\(2\)种操作:\(a_i\gets\left\lfloor\frac{a_i}{2}\right\rfloor\)或\(a_i\gets2\timesa_i\)。问最少要多少次才能使\(A\)和\(B\)中的元素相等。分析首先我们可以令\(a......
  • Codeforces Round 901 (Div. 2)
    CodeforcesRound901(Div.2)A-JellyfishandUndertale解题思路:卡在最后秒放。若\(x_i>(a-1)\):那么该\(x_i\)的贡献为\(a-1\)。否则,该\(x_i\)的贡献为\(x_i\)。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;typedefpair<int,in......
  • 901DIV2 (A~D)
    901DIV2A~DA:大于等于\(a-1\)的贡献都是a-1.voidsolve(){intans=0;inta,b,n;cin>>a>>b>>n;ans+=b;for(inti=1;i<=n;i++){intx;cin>>x;if(x>=a)x=a-1;ans+=x;}cout<<......
  • Educational Codeforces Round 155 (Rated for Div
    B.ChipsontheBoard题解:贪心显然我们可以把题意转化为:对于任意一个\((i,j)\),我们可以花费\(a_{i,j}\)的代价占据第\(i\)行和第\(j\)列,求占据所有格子的最小代价考虑两种情况:在每一行选一个格子在每一列选一个格子贪心选即可intn,a[N],b[N];voidsolve......