首页 > 其他分享 > Codeforces Round #838 (Div. 2) A-B,补C,D

Codeforces Round #838 (Div. 2) A-B,补C,D

时间:2022-12-30 09:23:02浏览次数:39  
标签:int res 838 Codeforces LONG using Div include define

A. Divide and Conquer

题意:

给定n个数,每次操作可以使得:$$ \lfloor\frac{ai}{2}\rfloor $$,求最少的操作次数使得n个数的总和为偶数。

分析:

  • 和为偶数,res = 0
  • 和为奇数,暴力模拟
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
#define mst(x, y) memset(x, y, sizeof x)
#define endl '\n'
#define INF LONG_LONG_MAX
#define x first
#define y second
#define int long long
#define Lson u << 1, l, mid
#define Rson u << 1 | 1, mid + 1, r
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int N = 200010, MOD = 1e9 + 7;
const double EPS = 1e-6;
typedef pair<int, int> PII;
typedef unordered_map<int, int> Ump;
int T;
int n;
int a[N];
int res;
int sum;
void solve()
{
    sum = 0;
    res = INF;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i], sum += a[i];

    if (sum & 1)
    {
        for (int i = 1; i <= n; i++)
        {
            int idx = 0, tmp = sum, num = a[i];
            while (tmp & 1 && a[i])
            {
                a[i] /= 2;
                tmp -= (num - a[i]);
                idx++;
            }
            if (tmp % 2 == 0)
                res = min(res, idx);
            // cout << "a[i] : " << a[i] << " idx : " << idx << endl;
        }
        cout << res << endl;
    }
    else
        cout << "0" << endl;
}
signed main()
{
    FAST;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

B. Make Array Good

题意:

对每一个 ai 操作,可以加上一个数 k(0 ≤ k ≤ ai),操作之后使任意两个数,较大的数能被较小的数整除,操作数 ≤ n

分析:

可以选择最小的数作为底数,每个数扩展成底数的倍数(倍数满足的底数的2的整次幂);
为什么可行:
对于此时的x,$$ d\times2^{n}\leqslant x\leqslant d\times2^{n + 1} $$
试计算最大差值:$$ d\times2^{n + 1} -x$$
又$$ x\geq d\times2^{n}$$
所以最大差值一定<x,即最大操作次数为n

#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
#define mst(x, y) memset(x, y, sizeof x)
#define endl '\n'
#define INF LONG_LONG_MAX
#define x first
#define y second
#define int long long
#define Lson u << 1, l, mid
#define Rson u << 1 | 1, mid + 1, r
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int N = 200010, MOD = 1e9 + 7;
const double EPS = 1e-6;
typedef pair<int, int> PII;
typedef unordered_map<int, int> Ump;
int T;
int res;
int n;
int a[N];
int minv;
void solve()
{
    minv = INF;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        minv = min(minv, a[i]);
    }

    cout << n << endl;
    for (int i = 1; i <= n; i++)
    {
        int num = a[i];
        for (int j = 1;; j *= 2)
        {
            if (num <= minv * j)
            {
                cout << i << " " << minv * j - num << endl;
                break;
            }
        }
    }
}
signed main()
{
    FAST;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

C. Binary Strings are Fun

题意(没看懂在说什么,样例也看不懂)复制了:

  • 定义一个好的 01 串为:对于每一个奇数位上的数一定是前缀串中的中位数。
    也就是说:如果 si = 1 ,那么对于前i个位置中,1 出现的次数必须多于 0 出现的次数 。
  • 定义一个字符串的拓展字符串:对于一个长度为k的字符串,插空添加 0 或 1

对于给定的字符串s,对于他的每一个前缀,求好的字符串的总数。

分析:

要想奇数位上的 1 或 0 有贡献,每一个插入的数都要考虑:
对于给定的 s :

  • s[i] != s[i - 1],只需要添加与s[i]相同的数即可实现数量上的反超
  • s[i] == s[i - 1],此时不管添加 0 还是 1 ,都不会对数量的反超有影响,所以此时有 2 种情况

类推下去每种情况进行累加

#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
#define mst(x, y) memset(x, y, sizeof x)
#define endl '\n'
#define INF LONG_LONG_MAX
#define x first
#define y second
#define int long long
#define Lson u << 1, l, mid
#define Rson u << 1 | 1, mid + 1, r
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int N = 200010, MOD = 998244353;
const double EPS = 1e-6;
typedef pair<int, int> PII;
typedef unordered_map<int, int> Ump;
int T;
int n;
string s;
int res;
void solve()
{
    res = 0;
    cin >> n >> s;
    s = " " + s;
    int idx = 1;
    for (int i = 1; i <= n; i++)
    {
        if (s[i] != s[i - 1])
            idx = 1;
        else
            idx = idx * 2 % MOD;
        res = (res + idx) % MOD;
    }
    cout << res % MOD << endl;
}
signed main()
{
    FAST;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

标签:int,res,838,Codeforces,LONG,using,Div,include,define
From: https://www.cnblogs.com/Aidan347/p/17012448.html

相关文章

  • Codeforces 1253 C. Sweets Eating 做题记录(DP)
    很明显,贪心策略是先吃甜度大的可以保证最终的总甜度最小,因此我们先从小到大排个序。一天可以吃$m$个,因此我们对于每个$k$,就让甜度前$1~m$名在第一天吃,前$m+1~2m$名第二......
  • [Codeforces Round #841]
    [CodeforcesRound#841]CodeforcesRound#841(Div.2)andDividebyZero2022A.JoeyTakesMoneyJoeyTakesMoneProblem:给一个正整数序列\(a_1,a_2,…,a_n(n......
  • Codeforces 1336 F Journey 题解
    题目链接这题的方法口糊一下没有很难,没达到3500的水准。但是写起来才发现是真的恶心(主要是容易写错),没写过这么累的题,可能难度就体现在这里吧。计数的时候是要分类讨论......
  • Codeforces Round #690 (Div. 3) E1. Close Tuples (easy version) (贪心+思维)
    https://codeforces.com/contest/1462/problem/E1E1.CloseTuples(easyversion)题目大意:给定一个长度为n的序列a,由1到n的整数组成,某些元素可能相等。找出m=3个元......
  • Codeforces 1336 F Journey 题解
    题目链接这题的方法口糊一下没有很难,没达到3500的水准。但是写起来才发现是真的恶心(主要是容易写错),没写过这么累的题,可能难度就体现在这里吧。计数的时候是要分类讨论......
  • Codeforces Round #766 (Div. 2)C,D
    CodeforcesRound#766(Div.2)C,D今天A竟然看错了,还好后来发现了,A题就写了40几分钟,真有你的过了B,排名是8千多,比前几天好一点,加油ヾ(◍°∇°◍)ノ゙CC相比于D,我更没有......
  • Codeforces Round #764 E
    E.Masha-forgetful题链结论就是任何长的串都可以被2,3长度的串表示后面就是暴力hash和很常规的dp[i]表示前i个是否匹配了voidsolve(){intn,m;cin>>n>>m;tu......
  • CodeForces 1163D Mysterious Code
    洛谷传送门CF传送门zxx的题单来的(发一个无脑kmp自动机+dp做法。看到题就很dp,考虑设计状态。显然填字母时要知道当前串与\(s,t\)的匹配位数,否则就不知道\(s,......
  • Codeforces 随机补题记录
    日期序号题号点评12.2029CF1694E很有借鉴意义的化用算法题12.2138CF1713F子集启蒙题12.2954CF1761E有很多细节,要想清楚,下次不要面向数据编程了......
  • Educational Codeforces Round 7
    EducationalCodeforcesRound7https://codeforces.com/contest/622/problems3/6:ABDA.InfiniteSequence水题#include<bits/stdc++.h>usingnamespacestd;i......