首页 > 其他分享 >Codeforces Round 962 (Div. 3)

Codeforces Round 962 (Div. 3)

时间:2024-08-02 14:27:45浏览次数:13  
标签:962 int text sum Codeforces ++ new Div scanf

Abstract

第一次打 CF 的比赛~~~~


A. Legs

Idea

签到题,没什么好说的。

Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n;
        scanf("%d", &n);
        int cnt = n / 4;
        n %= 4;
        cnt += n / 2;
        printf("%d\n", cnt);
    }
    return 0;
}

B. Scale

Idea

还是签到题,模拟一遍就行了,也没什么好说的。

Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n, m;
        scanf("%d%d", &n, &m);
        string text;
        string ans[2000];
        for (int i = 1; i <= n; i++)
        {
            cin >> text;
            if (m == 1)
            {
                ans[i - 1] = text;
                continue;
            }
            if (i % m != 1)
            {
                continue;
            }

            for (int j = 0; j < text.length(); j += m)
            {
                ans[(i - 1) / m] += text[j];
            }
        }

        for (int i = 0; i <= (n - 1) / m; i++)
        {
            cout << ans[i] << endl;
        }
    }
    return 0;
}

C. Sort

Idea

和排序没什么关系,实际上就是问你对于区间 [l,r] , a 变换几个字符后,它的组成就可以和 b 一样,那么我们只需要给每一个字母都做前缀和,就能知道区间 [l,r] 种 a 和 b 的字符组成情况,然后考虑变换的最小次数就可以了,这个需要模拟得出,具体模拟方法见代码。

Code

#include <bits/stdc++.h>
using namespace std;

int t;
int a[30][300000];
int b[30][300000];
void solve()
{
    int n, m;
    cin >> n >> m;
    string text;
    cin >> text;

    int len = text.length();
    for (int i = 0; i < len; i++)
    {
        for (int j = 0; j < 26; j++)
        {
            a[j][i + 1] = a[j][i];
        }
        a[text[i] - 'a'][i + 1]++;
    }

    cin >> text;

    for (int i = 0; i < len; i++)
    {
        for (int j = 0; j < 26; j++)
        {
            b[j][i + 1] = b[j][i];
        }
        b[text[i] - 'a'][i + 1]++;
    }

    for (int i = 0; i < m; i++)
    {
        int ans = 0;
        int l, r;
        cin >> l >> r;
        int sum = 0;
        for (int i = 0; i < 26; i++)
        {
            int new_sum = sum + (a[i][r] - a[i][l - 1]) - (b[i][r] - b[i][l - 1]);
            // 如此计算变换的最小次数
            if (new_sum > 0 && sum <= 0)
            {
                ans += new_sum;
            }
            else if (new_sum < 0 && sum >= 0)
            {
                ans -= new_sum;
            }
            else if (sum <= 0 && new_sum < sum)
            {
                ans += sum - new_sum;
            }
            else if (sum >= 0 && new_sum > sum)
            {
                ans += -sum + new_sum;
            }

            sum = new_sum;
        }
        cout << ans << endl;
    }

    return;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

D. Fun

Idea

直接枚举 a,b,c 当然会超时了,实际上,我们可以只枚举 b、c ,然后根据 b、c 的取值判断 a 的范围,这里需要做一些公式推导。为了枚举出的保证情况不重复,我们可以规定 a > b > c,然后再考虑 a、b、c 中有数字相等的情况即可。

Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
    int t;
    scanf("%lld", &t);
    while (t--)
    {
        int n, x;
        scanf("%lld%lld", &n, &x);
        bool ok = 1;
        int cnt = 0;
        for (int b = 1; 3 * b + 3 <= x; b++)
        {
            for (int c = b + 1; ok; c++)
            {
                int a = x - b - c;
                a = min(a, (n - b * c) / (b + c));
                if (a <= c)
                {
                    break;
                }
                int sum = a - c;
                cnt += 6 * sum;
            }
        }
        int num = pow(n / 3, 0.5);
        cnt += min(x / 3, num);
        for (int b = 1;; b++)
        {
            int a = min((n - b * b) / 2 / b, x - 2 * b);
            if (a <= 0)
            {
                break;
            }
            if (a < b)
            {
                cnt += 3 * (a);
            }
            else
            {
                cnt += 3 * (a - 1);
            }
        }
        cout << cnt << endl;
    }
    return 0;
}

标签:962,int,text,sum,Codeforces,++,new,Div,scanf
From: https://www.cnblogs.com/carboxylBase/p/18338700

相关文章

  • HT-018 Div3 构造 题解 [ 黄 ] [ 数学 ] [ 结论 ]
    构造:结论题,gcy数竞大佬tql%%%orz。结论先放结论:如果\(x\bmod4=2\),那么\(x\)无法被表示为\(a^2-b^2\)的形式;除此之外的其他数都可以。证明对\(a^2-b^2\)因式分解,得\(x=(a+b)(a-b)\)。当\(x\bmod2=1\)时包含\(x\bmod4=1\)和\(x\bmod4=3\)的情况。......
  • Educational Codeforces Round 168 (Rated for Div. 2)A——D题解
    EducationalCodeforcesRound168(RatedforDiv.2)A——D题解A.StrongPassword题意:给一个小写字符串密码,添加一个小写字母,使得密码更加复杂。题解:有相同的相邻的字母,再其中间添加不同的字母;如果没有相同的相邻的字母,则最后添加一个字母。#include<bits/stdc++.h>......
  • HT-018 Div3 能量消耗 题解 [ 绿 ] [ 线性 dp ] [ 前缀和优化 ]
    能量消耗:一个前缀和优化dp的大典题,要是数据水一点\(O(n^3)\)都能硬草过去。思路显然,定义\(dp[i]\)为考虑前\(i\)个塔,并且将前面的精灵全部收集的最小代价。于是转移:\[dp[i]=min(dp[i],dp[j]+w(j,i)+c[i])\]其中\(0\lej<i\lem\),\(w(j,i)\)表示收集从塔\(j\)到......
  • Codeforces Round 903 (Div. 3)(A~F)
    目录A.Don'tTrytoCountB.ThreeThreadletsC.PerfectSquareD.DivideandEqualizeE.BlockSequenceF.MinimumMaximumDistanceA.Don'tTrytoCountProblem-A-Codeforces因为字符串的长度很小,我们可以暴力求解,每次操作都可以使字符串s的长度倍增......
  • CodeForces 1619D New Year's Problem
    题目链接:CodeForces1619D【NewYear'sProblem】思路    可以因为最多只能逛n-1个商店,当n-1大于等于m的时候,所有朋友都能取最大值,否则至少有两个人要选择相同的商店,所以依次枚举两个人选择同一个商店,其他人选择喜悦值最大的商店。代码#include<cstddef>#incl......
  • Educational Codeforces Round 168 (Rated for Div. 2) 赛后总结
    比赛链接赛时提交情况:CF1997A.StrongPassword赛时思路首先看到题目可以想到的是,我们要加入的这个字符不能与其相邻字符相同,所以我没有多想就写出了第一份代码:if(s[0]=='a')cout<<'b';elsecout<<'a';cout<<s<<endl;交上之后喜提WA1。于是冷静了一会儿仔细观察了一......
  • CodeForces 1132B Discounts
    题目链接:CodeForces1132B【Discounts】思路    因为使用coupons购买q[i]块巧克力,不需要付最便宜的那块巧克力的钱,所以为了使得优惠最大化,所以可以在使用优惠券的时候购买最贵的p[i]块巧克力,所以计算所有巧克力价格高之和和排序后很快能得到答案。代码#include<cst......
  • CodeForces 1873A Short Sort
    题目链接:CodeForces1873A【ShortSort】思路    签到题,因为能交换两个元素的位置,所以只需要判断是否有一个元素在他原来该在的位置上就行。代码#include<iostream>#include<cstring>usingnamespacestd;#definelllonglongconstintN=1e5+10;void......
  • 一个div 使用flex 布局2个div,第一个div占75%,另一个占25%
    <divclass="container"><divclass="childchild-75">第一个div</div><divclass="childchild-25">第二个div</div></div>.container{display:flex;/*启用Flexbox*/width:100%;/*假设容器占满整......
  • flex 一行放四div 每个div 放三个div
    <!DOCTYPEhtml><html><head><style>.container{display:flex;flex-wrap:wrap;}.outer-div{display:flex;width:25%;/*每个外部div占据100%宽度的25%*/box-sizing:border-box;padding:10px;/*根据需要调整间距......