首页 > 其他分享 >Codeforces Round 894 (Div. 3) A-E cd 894 div3

Codeforces Round 894 (Div. 3) A-E cd 894 div3

时间:2024-07-01 09:20:15浏览次数:25  
标签:894 数列 jud int ll cin Codeforces cd 翻转

A. Gift Carpet
每道题都是伸缩代码框有ac代码请不要漏掉
--------------------------题解-----------------------------
按先行便然后列再变循环 设置jud每满足一个条件就让jud++ 只有jud==相应值的时候才让其++

点击查看代码
#include<bits/stdc++.h>
using namespace std;
char a[30][30];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        int jud=0;
        
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
            }
        }
        for(int j=1;j<=m;j++)
        {
            for(int i=1;i<=n;i++)
            {
                if(jud==0&&a[i][j]=='v')
                {
                    jud++;
                    break;
                }
                if(jud==1&&a[i][j]=='i')
                {
                    jud++;
                    break;
                }
                if(jud==2&&a[i][j]=='k')
                {
                    jud++;
                    break;
                }
                if(jud==3&&a[i][j]=='a')
                {
                    jud++;
                    break;
                }
            }
        }
        if(jud==4) cout<<"YES"<<'\n';
        else cout<<"NO"<<'\n';
    }
}

B. Sequence Game

这题题意比较难理解,总的来说就是B的数列是A中 a[i]>=a[i-1]的数据现在让你根据B数列构造一个可能的A数列出来

--------------------------题解-----------------------------------------

经过长时间观察后我得出,只需要遍历B数列,如果看到一个b[i]<b[i-1]就说明原数列在这个地方不符合a[i]>=a[i-1]的要求,因此我们按照以下方法构造

b[i]>=b[i-1]则照抄b数列,不符合该要求时便多构造一个b[i-1]使他在原数列中符合要求 按照我的方法模拟一遍然后你输出构造的数列你就差不多懂了

可以在根据 (a[i]>=a[i-1]便放进b数列中这个要求检验一下看看是不是原先的B数列)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
int a[N];
int b[N];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        int cnt=1;
        b[1]=a[1];
        for(int i=2;i<=n;i++)
        {   

            if(a[i]<a[i-1])
            {
                cnt++;
                b[cnt]= a[i];
            }
            cnt++;
            b[cnt]=a[i];
        }
        cout<<cnt<<'\n';
        for(int i=1;i<=cnt;i++)
        {
            cout<<b[i]<<" ";
        }
        cout<<'\n';
    }
}

C. Flower City Fence

这题题意更是重量级的难懂,我大概概括一下,先给你一个如图一样排列的阶梯,然后你把这个阶梯按题目要求翻转(大的在下小的在上)然后再把翻转后的台阶看成一个全新的台阶,重新划分第1,2,3...阶梯把他们的高度统计出来,看他们的高度是否与未翻转的台阶相同(结合图理解)

---------------------------------------------------题解-------------------------------------------
首先我们要先记住题目给你的台阶一定是非递增数列也就是a[i+1]<=a[i] 加入有5个台阶 高度为6 6 6 6 6 把他们横过来之后 他们就会变成 5 5 5 5 5 5不符合要求由此我们可以看出每个台阶的高度都会对翻转

后的台阶高度做出一定贡献(也可能不做主要是看他翻转前的高度) 高度为x便可以对翻转后高度1~x的阶梯高度有1的贡献,所以我们可以得出一个结论 如果最大的a[1]>n的时候,该阶梯翻转之后是必然不可能和之前一样

的 比如n=1 a1=6 翻转后会变成 1 1 1 1 1 1.理解这块后就好做了我们枚举每一个点判断翻转后本应该最后对这个点做出贡献的x柱子(由于单调递减只要他做出了贡献他前面的也做出了贡献)有没有做到贡献以及x+1

个柱子是不是没有做到贡献(没有做到就对了) 可能比较难理解,建议反复读题和观看代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int a[N];
signed main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int jud=0;
        for(int i=1;i<=n;i++) cin>>a[i];![](/i/l/?n=24&i=blog/3418807/202407/3418807-20240701085937602-1590934993.png)

        if(a[1]>n) jud=1;
        a[n+1]=0;a[0]=0;
        if(jud==0){//这个if也要注意不然会数组越界,此题有更简单和暴力的办法,但我赛中只想到了这个
        for(int i=1;i<=n;i++)
        {
            if(a[a[i]]<i||a[a[i]+1]>=i) jud=1;//判断翻转后该位置柱子是否准确的被翻转前的柱子做到了贡献
        }
        }
        if(jud==1) cout<<"NO"<<'\n';
        else cout<<"YES"<<'\n';
    }
}

D. Ice Cream Balls

我不擅长的数学题,但总体难度不难主要考察二分,能看到这里的想必都是高手了,我会说的简单一点主要,分享一下我的推导思路

--------------------------------题解--------------------------------------
由题意我们知道这里面有一个数论原理,我简单解释一下,比如我们要凑出6种双球(以下统称sq单球统称dq),答案是 4
我们这么看第一个球可以和第2 3 4 个凑

第二个可以和3 4个凑

第三个可以和第4个凑
第4个没得凑
我们便可以列出这样的公式

x-1
+
x-2
+
x-3
+
x-4
=n
此时x为4 n=6便是正确答案
把这几个公式加起来可以简化成x*(x-1)/2==n
我们利用这个公式便可以进行二分
这是这题的第一个关键点

题目中说了需要正好能凑出n种双球我们拿n=179举例 这个样例你按照我的公式二分之后 l=19,我们是二分出来按照公式后得出来的最大但是绝对不超过n的一个数字便是19

然后19能正好凑出171种 但题目问的是需要几个球,因此可以买重复的凑成类似(1,1)(2,2)的sq 所以我们要在19的基础上再重复买(179-171)种球 19+8加起来便是27个与题目一答案一样
二分出来的并不是直接答案
这是第二个关键点

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll check(ll q)
{
      //if(q*q-((1+q)*(q/2))==n) return 3;
         if(q*(q-1)/2>n) return 1;
        else return 0;
    
 
}
int main()
{
    ll t;
    cin>>t;
    while(t--)
    {
        
        cin>>n;
       if(n==1) cout<<2<<endl;
       else{
	   
      //  x*x-1+x=n
        ll l=1,r=3e9;
        while(l<r)
        { // cout<<l<<endl;
            ll mid=(l+r+1)/2;
        //   cout<<mid<<endl; 
            if(check(mid)==0) l=mid;
            else r=mid-1;
        }
        
      //  cout<<l<<'\n';
        ll sum=0;
        sum=l*(l-1)/2;
        
         //cout<<sum<<endl;
         //sum=sum-(l-1);
         cout<<l+(n-sum)<<'\n';
    
    }
    
    }
}

E. Kolya and Movie Theatre

能看到这里的也是高手了,我就不赘述了,说得简单一点,这道题赛中时间不够了不然我就上大分了

这题总体不难主要考察数据结构和枚举,我们要枚举每一个 a[i]作为最后一个点(这里会影响减去了多少个d)同时维护一个最大值,同时开一个优先队列(小的在前)用来维护所选的m个是否需要去掉,不论我们怎选所消耗掉的dcnt都只和最后一个点有关所以我们不用考虑太多,每次减少的cntd恒等于d*i,因此我们只需要关心a[i]本身的大小就好..队列内部元素数量不足m时候主要是正数就入队切加入sum,队列元素>=m时候就判断是否需要把最小的移除

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll a[N];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n,m,d;
        cin>>n>>m>>d;
        for(ll i=1;i<=n;i++) cin>>a[i];
        priority_queue <int,vector<int>,greater<int> >q;
        ll sum=0;
        ll ans=0;
        ll cnt=1;
        ll nl=0;
        for(ll i=1;i<=n;i++)
        {   sum-=d;
        ll q1=q.size();
            if(q1<m)
            {
                if(a[i]>0) sum+=a[i],q.push(a[i]);
          //      cout<<sum<<endl;
            }
            else
            {
                ll num1=q.top();
                if(num1<a[i])
                {
                    sum=sum-num1+a[i];
                    q.pop();
                    q.push(a[i]);
                }
                   
            }
      //   cout<<sum<<" "<<a[i]<<endl;
            ans=max(ans,sum);
        }
        cout<<ans<<'\n';


        

    }
}
/*
1
2 1 1
-1 2
*/

请各位看了之后大胆评论说一下感受,会根据各位的感受调整

标签:894,数列,jud,int,ll,cin,Codeforces,cd,翻转
From: https://www.cnblogs.com/qau-marisa3/p/18277395

相关文章

  • 说一说ABAP CDS View的发展历史与特性
    1.背景随着SAPFiori应用程序的兴起,SAP领域的小伙伴接触和使用ABAPCDSView的机会也是越来越多。今天,让我们花些时间,一起在了解下这项技术的设计初衷和发展历史。2.设计初衷说起ABAPCDSView,就不得不提及SAPHANA。SAPHANA引入了内存计算技术,这让ABAP开发范式发生了......
  • Codeforces Round 954 (Div. 3)
    A.XAxis题意:给3个x轴上的点xi,我们要放置一个点到x轴上,到这3个点的距离最短。(1<=xi<=10)思路:直接暴力破解即可inta,b,c;inlineintcal(intx){ returnabs(x-a)+abs(x-b)+abs(x-c);}voidsolve(){ cin>>a>>b>>c; intans=(int)1e9; for......
  • Kubernetes面试整理-解释Etcd在Kubernetes中的作用,包括如何管理配置数据和状态信息
    etcd是一个分布式的键值存储系统,在Kubernetes中起着至关重要的作用。它主要用于存储集群的所有配置数据和状态信息,确保这些数据的一致性和高可用性。具体来说,etcd在Kubernetes中的作用如下:etcd的作用● 配置存储:etcd存储Kubernetes集群的所有配置信息,包括节点......
  • 【华为OD机试真题】224、欢乐的周末 | 机试真题+思路参考+代码分析(最新抽中CD卷)(C++、J
    文章目录一、题目......
  • 创新实训 (九)CodeForces 数据和微调数据处理
    Codeforces数据获取Codeforces的题目中存在一些数学公式,所以处理的时候需要比较小心的对其进行处理。首先是题面数据,在CF当中标识一道题目的方式是problemSet与problemId。其中problemSet是一个数字,而problemId是一个字母。另外需要注意的是CF题面中存在许多数学......
  • 基于CDMA的多用户水下无线光通信(2)——系统模型和基于子空间的延时估计
      本文首先介绍了基于CDMA的多用户UOWC系统模型,并给出了多用户收发信号的数学模型。然后介绍基于子空间的延时估计算法,该算法只需要已知所有用户的扩频码,然后根据扩频波形的循环移位在观测空间的信号子空间上的投影进行延时估计。1、基于CDMA的多用户UOWC系统模型  首......
  • 如何使用ig507金融数据库的股票接口,股票API来获取MACD指标
    一、MACD指标简介MACD(MovingAverageConvergenceDivergence,移动平均收敛/发散)是一种趋势跟踪动量指标,用于分析股票或其他金融产品的价格趋势。MACD由两部分组成:差离值(DIF)和信号线(DEA)。DIF是短期(通常12天)指数移动平均线(EMA)与长期(通常26天)EMA的差值,再通过一个平滑期(通常9天)的EMA......
  • 如何使用ig507金融数据库的股票接口,股票API来获取MACD指标
    一、MACD指标简介MACD(MovingAverageConvergenceDivergence,移动平均收敛/发散)是一种趋势跟踪动量指标,用于分析股票或其他金融产品的价格趋势。MACD由两部分组成:差离值(DIF)和信号线(DEA)。DIF是短期(通常12天)指数移动平均线(EMA)与长期(通常26天)EMA的差值,再通过一个平滑期(通常9天)的E......
  • 带你彻底弄清CDMA码分多址的原理
    1.作用:主要用于无线多址接入,且具有很强抗干扰能力2.基本概念(1)码片:一个短间隔叫一个码片,1bit时间划分m个短间隔,则称1bit时间有m个码片(2)码片序列:1bit时间有m个码片,也就是每m个码片就有1bit的信息(每个站点都有自己的码片序列)(3)码片内容:码片中0写为-1,码片中1写为+13.站点发送......
  • P1072 [NOIP2009 提高组] Hankson 的趣味题【GCD】
    [NOIP2009提高组]Hankson的趣味题题目描述Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson。现在,刚刚放学回家的Hankson正在思考一个有趣的问题。今天在课堂上,老师讲解了如何求两个正整数......