首页 > 编程语言 >开学过半 (cf补题和算法训练)

开学过半 (cf补题和算法训练)

时间:2023-10-11 16:57:13浏览次数:47  
标签:开学 int max cf long 补题 const include define

Problem - A - Codeforces

题意: 给你一个n/2个元素的b数组,然后让你构造出一个n个元素的排列数组

其中这些p数组里的数有以下要求

注意这个p数组要求你搞字典序最小,也就是最好小的元素在前面

如果b = [4,3,6],那么可以从中得到的词法最小排列是p = [1,4,2,3,5,6],因为:

  • b1=max(p1,p2)=max(1,4)=4
  • b2=max(p3,p4)=max(2,3)=3
  • b3=max(p5,p6)=max(5,6)=6

就是让你搞一个这样的,如果不行就打-1

 

题解:

首先我们需要知道 搞一个n的排列里面的元素不能大于n所以,我们在题目给出的b数组里判断一些如果b[i]>n  ,我们直接输出-1即可

否则 我们就需要统计一下在这n个排列中我们缺了拿一些数字,我们用set存储,方便我们后面进行删除操作

然后我们就看规则拉

首先我们需要在这些缺的数组里找到要小于b数组的元素然后把他俩放在一起就行了

然后,我们可以二分寻找最大且小于当前元素的值,这里注意,我们应该倒着去扫b数组,这样二分最大元素就在后面

找到以后,我们直接删除这个元素,然后一跑就是字典序最小了,我们在缺的值,大的值都在后面

#include <bits/stdc++.h>
#pragma  GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
#define int long long
//#define endl '\n';
using namespace std;
const int N=2e5+7,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=100003;
typedef pair<int,int> PII;

int a[N];

void solve()
{
    int n;
    cin>>n;
    int ma=0;
    map<int,int> mp;
    set<int> b;
    int f=1;
    for(int i=1;i<=n/2;i++)
    {
        cin>>a[i];
        if(a[i]>n || mp[a[i]]==1)
        {
            f=0;
        }
        mp[a[i]]=1;
        ma=max(ma,a[i]);
    }
    if(f==0)
    {
        cout<<-1<<endl;
        return;
    }

    for(int i=1;i<=ma;i++)
    {
        if(mp[i]!=1)
        {
            b.insert(i);
        }
    }
    int c[N];
    for(int i=n/2;i>=1;i--)
    {
        auto it=b.upper_bound(a[i]);
        if(it==b.begin())
        {
            f=0;
            break;
        }
        it--;
        c[i]=*it;
        b.erase(c[i]);
    }
    if(f==0)
    {
        cout<<-1<<endl;
        return;
    }
    for(int i=1;i<=n/2;i++)
    {
        cout<<c[i]<<" "<<a[i]<<" ";
    }
    cout<<'\n';
}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

 

Problem - D - Codeforces

题意:

给你一个n和一个k,让你找到1到k里的一个数x,让n*x得出的结果尾巴的0要尽可能地多

如果无论这么搞都没有,那么就输出n*k即可

 

题解:

 我们先想一下  0是怎么来的

是不是由2*5得来,所以我们想要更多地0,我们就需要在n里面找多余地2和5

里面地2和5会相互成0,所以我们找出多余地,然后用在x里面乘就行了,就是用x里面地2  或者   5去帮n补0

这个就是分离因子地思想

然后统计一下10

最后m/x*x就是在k里面找地最大数咯

#include <bits/stdc++.h>
#pragma  GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
#define int long long
//#define endl '\n';
using namespace std;
const int N=2e5+7,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=100003;
typedef pair<int,int> PII;

int a[N];
int n,m;
void solve()
{

    cin>>n>>m;
    int t=n;

    int ans2=0,ans5=0;
    while (t%2==0)
    {
        ans2++;
        t/=2;
    }
    t=n;
    while (t%5==0)
    {
        ans5++;
        t/=5;
    }
    int x=1;
    while (ans2>ans5 && x*5<=m)
    {
        x*=5;
        ans2--;
    }
    while (ans2<ans5 && x*2<=m)
    {
        x*=2;
        ans5--;
    }

    while (x*10<=m)
    {
        x*=10;
    }

    cout<<m / x * x * n<<'\n';
}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

 

标签:开学,int,max,cf,long,补题,const,include,define
From: https://www.cnblogs.com/whatdo/p/17757608.html

相关文章

  • CFS(一)设计理念与实现架构
    前言本文对CFS的基础的设计理念以及在内核实现上的基本代码架构进行了分析,从宏观上梳理调度和CFS的脉络。本文所有的代码基于Linux4.19。CFS的设计理念和目标CFS(CompletelyFairScheduler)完全公平调度器,从字面上看定义的很清晰,首先CFS的本质是一个调度器,所谓调度就是决定CPU......
  • 题解: CF768D Jon and Orbs
    题解:CF768DJonandOrbs一句话体面:有k种不同的物品,每天等概率任取一种(不一定是新的种类)。q组询问,每组给出一个p,问取完这k件物品的概率不小于\(\frac{p}{2000}\)的最小天数不用说,肯定是概率DP了1.定义:\(f_{i,j}\)表示前\(i\)天选取了\(j\)种物品的概率(\(P.S.\)该定义不......
  • [CF1870F] Lazy Numbers
    LazyNumbers我觉得本题难度在于银剑的构造......我们把k进制下的数去掉前导零放在Trie树上,并且越高位的深度越小,这样我们看出某个节点的dfs序就是排名,称排名减数值为va。我们需要求va=0的点数。不难发现某一深度从左往右的va单调不降,所以可以二分求出每层的点......
  • 模拟赛补题
    农场道路修建与没有上司的舞会类似,关键在于添加道路。添加的道路一定是两点中一有一无或两无,则判断哪些点必须有,用总方案数减去不合法方案数即可。P7828[CCO2021]SwapSwapSort基本思路不难,没有想到根号分治(准确来说是不会,呃呃),以及在\(x\)确定的情况下不会\(O(n)\)处理......
  • 模拟赛补题
    感觉模拟赛质量比之前打的高一些。Day1A赛时过B需要保存每个点的状态,为了使状态数尽量少,让每个点代表右下方是否已经达到终止状态,故如果一个点状态为\(1\),右下方所有点的状态都为1,那么状态能用轮廓线来描述,数量为\(\binom{n+m}{n}\),直接高斯消元。C将每条路径对应到一条......
  • CF1054D Changing Array
    题意给定\(n\)个小于\(2^k\)的数。可以任意让若干数\(xor\)\(2^k-1\)。问使得最终区间\(xor\)不为\(0\)的最大个数。Sol考虑前缀异或和。记异或和的数组为\(s\)。现在一个区间的贡献变为\(s_r\opluss_{l-1}\)。考虑何时该贡献为\(0\)。显然当\(s......
  • CF 1877 C
    C.Joyboard这道题需要进行分类讨论。当\(k=1\)时,即构造的数组中所有元素皆为\(0\)才成立,所以输出\(1\)。当\(k=2\)时,只有\(a[n+1]<=n\)或\(a[n+1]=x\)(其中\(n|x\))才成立,所以答案是\(n+\lfloor\frac{n+m}{n}\rfloor\)\((m>n)\)。当\(k=3\)时,只有\(a[n+1]>n\)且\(a[n+......
  • CF2400计数
    感觉其他都没它重要,开写。CF1628D1/2看题解前:游戏挺好玩,玩着玩着就可以推出式子:\(f_{i,j}=\frac{f_{i-1,j}+f_{i,j}}{2}\)边界情况大概是\(i=j\)时\(f_{i,j}=i\),\(j=0\)时\(f_{i,j}=0\)直接暴力递推即可过D1,也是我想到的部分。看题解后:形式化dp式子,发现是个下三角......
  • [CF1508D] Swap Pass
    D-SwapPass先将所有\(a_i==i\)的点都直接去掉考虑将\(i\)向\(a_i\)连边,那么就会形成一个个的环考虑只有一个环的情况,那么我们任意固定一个点\(x\),一直交换\(a_x\)与\(a_{a_x}\)直到\(a_x==x\),因为所有所有边都交于一点,所以这肯定是合法的但更普遍的情况是不止有一个环,那么......
  • [CF1672G]Cross Xor
    G-CrossXor对于\((n\&1)\&\&(m\&1)\)的情况,所有行、列的异或和的必须相等(异或和指当前行/列中所有元素的异或和)每次修改的点\((x_1,y_1)\),\((x_2,y_1)\),\((x_1,y_2)\),\((x_2,y_2)\)使得所有行和列的异或和不会改变只对\((i,j)\)进行一次操作,那么所有行和列的异或和都会......