首页 > 其他分享 >cf的几道小题

cf的几道小题

时间:2022-11-19 20:58:06浏览次数:57  
标签:std const int cf long 几道 using include

1、E - Fridge

教训:做题的时候,没有想清楚问题,把问题复杂化了

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

const int N = 1010;
string st;
int cnt[N], minn = N, pos;
struct node
{
    int num;
    int sum;
    bool operator<(const node &p) const
    {
        if (sum < p.sum)
            return true;
        else if (sum == p.sum && num < p.num)
            return true;
        return false;
    }
} a[N];

signed main()
{
    cin >> st;
    for (int i = 0; i < st.size(); i++)
    {
        int x = st[i] - '0';
        cnt[x]++;
    }
    for (int i = 1; i <= 9; i++)
    {
        if (cnt[i] == 0)
        {
            cout << i;
            return 0;
        }
    }
    for (int i = 0; i < 10; i++)
    {
        a[i].num = i;
        a[i].sum = cnt[i];
    }
    if (!a[0].sum)
    {
        cout << 10;
        return 0;
    }
    sort(a + 1, a + 10);
    if (a[0].sum < a[1].sum)
    {
        cout << 1;
        for (int i = 1; i <= a[0].sum + 1; i++)
        {
            cout << 0;
        }
    }
    else
    {
        for (int i = 1; i <= a[1].sum + 1; i++)
        {
            cout << a[1].num;
        }
    }
    return 0;
}

2、J - Secret Santa

教训:数据范围比较大,直接暴力会超时,并且推公式比较麻烦,优先考虑打表

思路:当n >= 9时,会达到极限,后面的概率值都是一样的。

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

const int N  = 1010;
int a[N], num = 1, n;
double cnt[N];

signed main(){
    cin >> n;
    for(int i = 1; i <= 10; i++) a[i] = i;
    int ans = 0;
    for(int i = 1; i <= 10; i++){
        ans = 0;
        num = num * i;
        do{
            for(int j = 1; j <= i; j++){
                if(a[j] == j){
                    ans ++;
                    break;
                }
            }
        }while(next_permutation(a + 1, a + 1 + i));
        cnt[i] =  1.0 * ans / num;
    }
    if(n >= 10) cout <<fixed << setprecision(8) << cnt[10];
    else cout <<fixed << setprecision(8) << cnt[n];
}

3、CF1656C Make Equal With Mod

思路:如果想让所有的序列变成0,那么只需从序列最大的数开始取模,这样最后的结果一定是0

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

const int N = 1e5 + 10;
int n, a[N], t;

signed main(){
    cin >> t;
    while(t --){
        cin >> n;
        set<int> s;
        for(int i = 1; i <= n; i++){
            cin >> a[i];
            s.insert(a[i]);
        }
        bool flag1 = false, flag2 = false;
        for(set<int>::iterator it = s.begin(); it != s.end(); it ++){
            if(*it == 0) flag1 = true;
            if(*it == 1) flag2 = true;
        }
        if(flag1 && flag2){
            cout <<"NO" << endl;
        }
        else{
            sort(a + 1,a + 1 + n);
            bool flag = true;
            for(int i =1 ; i < n; i++){
                if(a[i + 1] - a[i] == 1 && a[1] == 1) {
                    flag = false; break;
                }
            }
            if(!flag) cout << "NO" << endl;
            else cout <<"YES" << endl;
        }
    }
    return 0;
}

4、D - Down the Pyramid

思路:求可变化的数的上界和下界,学会区分上界和下界。

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

const int N = 1e6 + 10;
int n, a[N], now, minn = 0, maxn = 0x3f3f3f3f;

signed main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    for(int i = 1; i <= n; i++){
        now = a[i] - now;
        if(i % 2 == 1){//偶数减x,所以x有最大值,要取上界最小值
            maxn = min(maxn, now);
        }
        else{//奇数 + x,所以x有最小值
            minn = max(minn, -now);
        }
    }
    if(minn > maxn) cout <<"0";
    else cout << maxn - minn + 1;
    return 0;
}

标签:std,const,int,cf,long,几道,using,include
From: https://www.cnblogs.com/N-lim/p/16907000.html

相关文章

  • cf796部分题解
    C.ManipulatingHistory题意:给出一些字符串,有原始串(只含一个字符的串)、被替换的串、替换串、最终串(最后一行),求原始串。2aabbcdacdInitiallysis"a".Inthe......
  • 「CF1677F」Tokitsukaze and Gems
    题目点这里看题目。给定一个长度为\(n\)的正整数序列\(\{a_i\}_{i=1}^n\)和参数\(k,p\)。对于两个长度为\(n\)的序列\(\{s_i\}_{i=1}^n,\{t_i\}_{i=1}^n\),我们......
  • 题解 CF1759G【Restore the Permutation】
    problem给定长为\(n/2\)的数组\(b\),试求出字典序最小的排列\(p\)使得\(b_i=\max_{p_{2i-1},p_{2i}}\),或者报告无解。\(n\leq10^5\)。solution考虑显然的结论:\(p_......
  • CF755G PolandBall and Many Other Balls 题解
    老师潦草的笔记(题目大意给你$n$个球,让你选$m(1\lem\lek)$组球。每组只有$1$个球或$2$个相邻球。令选出$m$组球的方案数为$f_m$,现在让你输出$f_i(1\l......
  • CF1588F Jumping Through the Array
    linkSolutionmd,摆了一周,现在是彻底废了/kk可以看出的是这玩意是若干个个环,不过我们会发现,这个性质没有什么用。发现不好做,考虑操作分块。我们可以发现对于操作\(1\)......
  • CF1610H Squid Game
    题面传送门首先定\(1\)为根节点,然后我们发现,如果全部的限制都是弯的,也就是\(x_i\)与\(y_i\)均不是两个点的LCA,则直接选择一个根节点就可以解决。然后如果全部限制都是直......
  • CF445D
    此题暴力可过。按照题意模拟即可。注意要用C++20。#pragmaGCCoptimize("O2,unroll-loops")#pragmaGCCtarget("avx,avx2")#include<bits/stdc++.h>usingnamespa......
  • CF1034D
    \(3500\)。根本想不到这种思路。先考虑这么一个问题:给定\(n\)个区间\([a_i,b_i)\)。\(q\)次询问,每次查询\((\cup_{l\lei\ler}[a_i,b_i))\cap\mathbbZ\)的元......
  • CF889E
    题目大意:给出正整数\(n\)和序列\(\{A_i\}\),定义\(f_k(x)=f_{k-1}(x)\bmoda_k,f_0(x)=x\),求\(\max_x{\sum_{i=1}^nf_k(x)}\)。\(n\le2\cdot10^5,A_......
  • CF1648D 简单清楚的做法
    CF1648D简单清楚的做法我自己做这题没做出来,看网上题解都有点难看懂,自己搞一个前置知识线段树维护:对于两个序列\(a,b\),给定\(l,r\),询问:\(\max(a_i+b_j),l\lei\le......