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

Codeforces Round 891 (Div. 3)

时间:2024-08-04 13:27:35浏览次数:7  
标签:tNum 891 int Codeforces len ++ 数组 Div include

比赛链接

完成度:4/7

这场比赛相对于上次那场909 div3,题目描述清楚许多(可能是出简单了)。


首先是B题,一道模拟四舍五入的题目

题目B

这题就是简单模拟,我们需要读入一个数字字符串,把他输入到一个数组当中,然后从低位到高位找大于等于5的数,如果找到了,那么之前的数包括这个数都变成0,下一位加一,这里有个特判,如果这个数是最后一个数,那就把这个数换成10,相当于向上进一位。在操作完成之后输出结果数组即可

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
#include <string>
#define int long long
using namespace std;

const int N = 200010;

void solve()
{
    string s;
    cin >> s;
    int len = s.size();
    vector<int> a(len, 0);
    for (int i = len - 1; i >= 0; i--)//处理字符串
    {
        a[i] = s[len - 1 - i] - '0';
    }
    bool check = false;
    int k = 0, j = 0, mark = -1;
    while (k < len) //处理完就停下
    {
        while (a[j] < 5 && j < len)//找大于等于5的数
        {
            j++;
        }
        k = j;
        if (a[j] >= 5 && j < len)
        {
            if (k < len - 1)
            {
                a[k + 1]++;
                mark = k; //在mark之前的数输出的时候都只输出个0
                k++, j++;
            }
            else if(k == len - 1)//特判
            {
                a[k] = 10;
                mark = k - 1;
                k++, j++;
            }
        }
    }
    for (int i = len - 1; i >= 0; i--) //输出
    {
        if (i <= mark) //mark之前的数
        {
            cout << 0;
        }
        else
        {
            cout << a[i];
        }
    }
    cout << endl;
}

signed main()
{

    int tNum;
    cin >> tNum;
    for (int i = 0; i < tNum; i++)
    {
        solve();
    }

    return 0;
}

题目C

题目C需要用到贪心与一些数学知识,这题让我们还原原数组,我们可以这样想,假如原数组里面有一个最小的数,那么不管这个数在数组里面的位置如何,处理过后的数组中这个数的出现次数是不变的,可以自己写几个数组模拟试试,那么这样就好办了,我们只用给题目给的操作后的数组排个序,然后从小到大按出现个数来把数字添加到答案数组(最小的第一个数出现的次数是n-1,第二个是n-2,以此类推),最后一个数也就是原数组里面最大的那个数不会出现在操作后得到的数组中,我们随便选一个就行,但是要注意最好是等于倒数第二大的那个数,直接把倒数第二大的那个数加一会超出数据范围(别问是咋知道的,说出来都是泪)

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
#include <string>
#define int long long
using namespace std;

const int N = 200010;

void solve()
{
    int n;
    cin >> n;
    vector<int> a((n * (n - 1)) / 2, 0);
    vector<int> b;
    for (int i = 0; i < (n * (n - 1)) / 2; i++) //输入操作后的数组
    {
        cin >> a[i];
    }

    sort(a.begin(), a.end()); //排序
    int mark = 0;
    n--; //因为最后大的数我们不知道所以填数的时候要减去这个数,在填完之后我们再选一个加进去
    while (n)
    {
        b.push_back(a[mark]);
        cout << a[mark]<<" ";
        mark += n;
        n--;
    }
    cout << a.back() << endl; //这里就是直接等于倒数第二大的那个数
}

signed main()
{

    int tNum;
    cin >> tNum;
    for (int i = 0; i < tNum; i++)
    {
        solve();
    }

    return 0;
}


最后是D题这题还是用到了点数学知识和贪心

题目D

他给了我们一个公式,根据这个公式找到强顶点,先从这个公式下手,可以化简成 au−bu≥av−bv,也就是输入第一个数组元素减去输入第二个数组对应的元素里面最大的那几个数就是强顶点,然后循环减去后的数组找答案就行

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
#include <string>
#define int long long
using namespace std;

const int N = 200010;

void solve()
{
    int n, x;
    cin >> n;
    vector<int> a(n + 1, 0);
    vector<int> b;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    int maxx = -20000000000, ans = 0;//maxx要注意数据范围不能是-1,题目数据给的最小值是-10^9
    for (int i = 1; i <= n; i++)
    {
        cin >> x;
        a[i] -= x;
        if (a[i] > maxx) //标记最大值
        {
            maxx = a[i];
        }
    }

    for (int i = 1; i <= n; i++)
    {
        if (a[i] == maxx)
        {
            ans++;
            b.push_back(i);//把数的编号填入答案数组
        }
    }
    cout << ans << endl;
    for (int i = 0; i < b.size(); i++)
    {
        cout << b[i] << " ";
    }
    cout << endl;
}

signed main()
{

    int tNum;
    cin >> tNum;
    for (int i = 0; i < tNum; i++)
    {
        solve();
    }

    return 0;
}

标签:tNum,891,int,Codeforces,len,++,数组,Div,include
From: https://www.cnblogs.com/chhh31/p/18341674

相关文章

  • CodeForces-808#D 题解
    思路分析分析样例1:3132原数组被分成1和32两部分,将2移到左边即可。我们设左边部分的和为\(s1\),右边为\(s2\),可以发现对于任何分割方式,只有满足\(s1\pmx=s2\mpx\)才可以继续讨论答案是否成立。推论1:由于\(x\ina\)(\(a\)为题目所给数列),因此\(|\s1-s2......
  • Codeforces Round 909 (Div. 3)--题目描述无法名状
    好吧,可能是我的文字功底太弱了,首先滴就是这个B题题目链接我一开始还以为这个能排序,就是算排完序之后的最大差,但是仔细一看题目,好像不要求使用排序,于是就尝试暴力做法。我发现的暴力做法是枚举k,直到k==n/2为止,当时是因为没有开longlong导致WA了,后面发现时间不是怎么多就没有......
  • Codeforces Round 962 (Div. 3)
    Abstract第一次打CF的比赛~~~~A.LegsIdea签到题,没什么好说的。Code#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;scanf("%d",&t);while(t--){intn;scanf("%d",&n);int......
  • 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......