牛客周赛 Round 35 (A~G)

news2024/12/26 11:30:40

本次A~D较为简单,E是一道很好的构造题,FG主要就是考察组合数和约数个数

A.小红的字符串切割

思路 :签到题

void solve()
{
   string s;cin>>s;
   int len=s.size();
   cout<<s.substr(0,len/2)<<endl<<s.substr(len/2);
}

B.小红的数组分配

思路:题意就是要我们根据已有数据分成两个一模一样的数组,那么就要满足所有数都是偶数个,然后再将每个数输出一半的次数即可

void solve()
{
  int n;cin>>n;
  vector<int> v(2*n);
  map<int,int> h;
  for(auto &t:v)
  {
    cin>>t;
    h[t]++;
  }
  
  int f=0;
  for(auto t:h)
  {
    if(t.se&1)
    {
        f=1;
        break;
    }
  }
  if(f)
  {
    cout<<-1;
    return ;
  }
  for(auto t:h)
  {
    for(int i=0;i<t.se/2;i++)
        cout<<t.fi<<' ';
  }
  puts("");
  for(auto t:h)
  {
    for(int i=0;i<t.se/2;i++)
        cout<<t.fi<<' ';
  }
}

C.小红关鸡 

 

思路:排序+枚举+二分,根据题意要求最大概率,那么也就是用两个栅栏框住最多的鸡窝,那么也就是求在合法区间中鸡窝数的最大值,我们可以枚举左端点a[L],然后二分查找大于等于a[L]+k的鸡窝的位置pos,如果存在a[L]+k这个鸡窝,那么a[L]~a[L]+k这个区间的鸡窝个数为pos-L+1,如果不存在a[L]+k这个鸡窝,那么a[L]~a[L]+k这个区间的最右边的鸡窝的位置为pos-1,那么这个区间的鸡窝个数为pos-1-L+1

void solve()
{
  int n,k;cin>>n>>k;
  vector<int> v(n);
  map<int,int> h;

  for(auto &t:v)
  {
    cin>>t;
    h[t]++;
  }

  sort(v.begin(),v.end());
  int maxd=0;

  for(int i=0;i<n;i++)
  {
    int x=v[i]+k;
    int pos=lower_bound(v.begin()+i,v.end(),x)-v.begin();
    if(h[x])
    maxd=max(maxd,pos-i+1);
    else maxd=max(maxd,pos-i);
    
  }

  double res=(maxd*1.0/n);
  printf("%lf",res);//题目没说保留几位小数且误差不超过1e-4,所以输出所有小数位的结果误差远低于1e-4
}

D.小红的排列构造 

思路:先用set<int> s将1~n全部存一遍,在输入数据时,如果s中存在这个数,则删掉这个数,否则说明这个数要么就是重复出现,要么就是不在1~n这个范围中,那么用一个数组存一下它的位置。输入完以后,s中保留的数就是需要将对应位置修改的数。

void solve()
{
  int n;cin>>n;
  map<int,int> h;
  set<int> s;

  for(int i=1;i<=n;i++) s.insert(i);

  for(int i=1;i<=n;i++)
  {
    int t;cin>>t;
    if(s.count(t))
    s.erase(t);
    else
    h[i]=t;
  }
  
  cout<<h.size()<<endl;
  for(auto t:h)
  {
    int pos=t.fi,x=t.se;
    cout<<pos<<' '<<(*s.begin())<<endl;
    s.erase(*s.begin());
  }
}

 E.小红的无向图构造

思路:这道题每条边的权值为1,如果要构建一棵二叉树,首先边至少为n-1,且每一层都要与上一层相连。那么我们可以做以下分析:

(1)m<n-1,肯定是无解的

(2)m>=n-1 ,用vector<int> g[N],存储每一层的节点,如果存在1~maxd(某个节点到1号节点的最短路径,也就是最大层数)中某一层为空,那么就无法构造出二叉树,无解。

(3)用vector<PII> ans 存储边,首先我们要构建一棵普通的二叉树,用第i层的所有节点连接第i-1层的第一个节点,ans.push_back({g[i-1][0],g[i][j]}),如果m>ans.size(),那么我们要考虑在同一层加边,或者第i层的所有节点与第i-1层除了g[i-1][0]的其他节点相连,如果这些操作都执行完了,仍不足m条边,则无解,否则遍历ans输出边

constexpr int N=1e5+5;
int a[N],n,m,maxd;
vector<int> g[N];
vector<PII> ans;

void solve()
{
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
    g[a[i]].eb(i);
    maxd=max(maxd,a[i]);
  }

  if(m<n-1)
  {
    cout<<-1;
    return ;
  }

  for(int i=1;i<=maxd;i++)
  {
    if(g[i].empty()) 
    {
        cout<<-1;
        return ;
    }
    for(auto t:g[i])
    ans.pb({g[i-1][0],t});
  }
    
  if(ans.size()<m)
  {
    //同一层的点相互连接
    for(int i=1;i<=maxd;i++)
    {
        for(int j=1;j<g[i].size();j++)
        {
            for(int k=j-1;k>=0;k--)
            {
                ans.pb({g[i][j],g[i][k]});
                if(ans.size()==m) break;
            }
            if(ans.size()==m) break;
        }
        if(ans.size()==m) break;
    }

    //当前层的点与上一层除了第一个点以外的其它点连接

    if(ans.size()<m)
    {
        for(int i=2;i<=maxd;i++)
        {
            for(int j=1;j<g[i-1].size();j++)
            {
                for(int k=0;k<g[i].size();k++)
                {
                    ans.pb({g[i-1][j],g[i][k]});
                    if(ans.size()==m) break;
                }
                if(ans.size()==m) break;
            }
            if(ans.size()==m) break;
        }
    }
  }
  if(ans.size()<m) cout<<-1;
  else 
  {
    for(auto t:ans)
    cout<<t.fi<<' '<<t.se<<endl;
  }
}

F.小红的子序列权值和(easy)

 思路:任何一个数可以表示为p1^q1*p2^q2*...pk^qk,约数个数为(q1+1)*(q2+1)*...*(qk+1)。题目只有1~3这三种数,由于1比较特殊,所以我们只需枚举2和3的所有组合,ans+=C(sum2,i)*C(sum3,j)*(i+1)*(j+1)*temp,temp=pow(2,1的个数),因为每个1有选和不选两种情况,那么是否将1放到2和3这个组合种以及放多少就是temp种情况了

constexpr int N=1e5+5,mod=1e9+7;
int C[1005][1005];
map<int,int> h;

void solve()
{
  int n;cin>>n;
  for(int i=0;i<n;i++)
  {
    int x;cin>>x;
    h[x]++;
  }

  int temp=1;
  for(int i=0;i<h[1];i++) temp=temp*2%mod;
  for(int i=0;i<=n;i++)
    for(int j=0;j<=i;j++)
    if(j==0||j==i) C[i][j]=1;
    else C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;

     int ans=0,three=h[3],two=h[2];
    for(int i=0;i<=two;i++)
        for(int j=0;j<=three;j++)
        {
           ans+=C[two][i]*C[three][j]%mod*(i+1)%mod*(j+1)%mod*temp%mod;
            ans%=mod;
        }
        cout<<(ans-1+mod)%mod;//还要减去一种子序列为空的情况
}

G.小红的子序列权值和(hard)

相较于easy版本n的数据范围改成了1e5

easy版本我们使用的方法时间复杂度为O(n*n),这里我们使用O(nlogn)做法,C(a,b)=a!/ ((a-b)!*b!),我们只需求1~n的阶乘,以及1~n的阶乘的逆元,根据easy版本我们得到公式C(cnt2,i)*(i+1)*C(cnt3,j)*(j+1)*2^cnt1,i属于[0,cnt2] , j属于[0,cnt3],i=0时,j属于[0,cnt3]时,ans1=C(cnt3,j)*(j+1)*2^cnt1,i=1时,j属于[0,cnt3]时,ans2=C(cnt2,1)*(1+1)*C(cnt3,j)*(j+1)*2^cnt1,

ans=ans1+ans2=(1+C(cnt2,1)*(1+1))  (C(cnt3,j)*(j+1)) *2^cnt1,化简之后我们可以发现公式为   2^{cnt1}\sum_{i=0}^{cnt2}C(cnt2,i)(i+1)\sum_{j=0}^{cnt3}C(cnt3,j)(j+1),所以求和部分只需分别用一个循环就可以搞定了

constexpr int N=1e5+5,mod=1e9+7;

int fact[N],infact[N],n;
map<int,int> h;

void solve()
{
  cin>>n;
  auto qmi = [&](int a,int b) ->int{
    int res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return res;
  };

  auto C = [](int a,int b) ->int{
   if(a<b) return 0;
   return fact[a]*infact[a-b]%mod*infact[b]%mod;
  };

  fact[0]=infact[0]=1;
  for(int i=1;i<=n;i++)
  {
    fact[i]=fact[i-1]*i%mod;
    infact[i]=infact[i-1]*qmi(i,mod-2)%mod;
  }

  for(int i=0;i<n;i++)
  {
    int x;cin>>x;
    h[x]++;
  }

  int temp=1,c2=0,c3=0,cnt2=h[2],cnt3=h[3];
  for(int i=0;i<h[1];i++) temp=temp*2%mod;
  
  for(int i=0;i<=cnt2;i++)
    c2=(c2+C(cnt2,i)*(i+1)%mod)%mod;
  
  for(int i=0;i<=cnt3;i++)
    c3=(c3+C(cnt3,i)*(i+1)%mod)%mod;
    
  cout<<(c2*c3%mod*temp%mod-1+mod)%mod;//同样会有一种情况是空串
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2083472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建面向切面编程项目

此项目在整合Mybatis基础上修改&#xff0c;可参考主页的整合Mybatis文章 注解版本 第一步 引入maven坐标 <!-- 切面编程所需jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId>…

Chapter 04 Vue指令(下)

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、指令修饰符二、v-bind对于样式操作的增强三、v-model应用于表单元素 前言 在 Vue.js 中&#xff0c;指令是带有 v- 前缀的特殊属性&#xff0c;不同属性对应不同的功…

[原理理解] Swin Transformer相对位置编码理解

文章目录 简述相对位置编码的意义直观理解注意力相对位置获取必要性当前位置初步获取利用广播机制获取相对位置索引XY获取最后相对位置1获取最后相对位置2最终的相对位置值嵌入 简述 在看Swin Transformer的时候&#xff0c;一开始在相对位置编码这一块的理解上卡壳了挺久&…

27 Combobox组件

Tkinter ttk.Combobox 组件使用指南 ttk.Combobox 是 Tkinter 的一个高级控件&#xff0c;它结合了文本框和下拉列表的功能&#xff0c;允许用户从预定义的选项列表中选择一个值。ttk 模块是 Tkinter 的一个扩展&#xff0c;提供了更现代的控件外观和行为。以下是对 ttk.Combo…

hyperf json-rpc

安装 安装docker hyperf 安装 hyperf-rpc-server-v8 &#xff08;服务端&#xff09; docker run --name hyperf-rpc-server-v8 \ -v /www/docker/hyperf-rpc-server:/data/project \ -w /data/project \ -p 9508:9501 -it \ --privileged -u root \ --entrypoint /bin/sh \…

港口行业大数据BI建设方案(24页PPT)

方案简介&#xff1a; 港口行业BI建设方案旨在通过数据整合、分析、可视化及智能化决策支持等手段&#xff0c;提升港口运营效率与管理水平。它的建设实施有利推动港口数字化转型、是提升竞争力的关键举措。通过构建高效、智能的BI系统&#xff0c;港口企业能够实现对运营数据…

软设例题—哈夫曼树

哈夫曼树基本概念&#xff1a; 叶子结点的路径长度&#xff1a;结点到根的分支数量 树的路径长度&#xff1a;所有叶子结点路径长度之和 权&#xff1a;叶子结点的数值 叶子结点的带权路径长度&#xff1a;权重*路径 树的带权路径长度&#xff1a;所有叶子结点带权路径之和…

# Windows 系统安装 virtualbox/vmware 虚拟机教程

Windows 系统安装 virtualbox/vmware虚拟机教程 段子手-168 2024-8-28 一、virtualbox/vmware 简介 1、VirtualBox VirtualBox 是开源的、免费虚拟机软件。VirtualBox 是由德国 Innotek 公司开发&#xff0c;由 Sun Microsystems 公司出品的软件&#xff0c;号称是最强的免…

前端学习笔记-Web APIs篇-01

变量声明 变量声明有三个 var let 和 const 建议&#xff1a; const 优先&#xff0c;尽量使用const&#xff0c; 原因是&#xff1a; const 语义化更好很多变量我们声明的时候就知道他不会被更改了&#xff0c;那为什么不用 const呢&#xff1f;实际开发中也是&#xff0c…

如何使用ssm实现基于ssm的软考系统+vue

TOC ssm321基于ssm的软考系统vue 系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#x…

11 索引

目录 没有索引&#xff0c;可能会有什么问题认识磁盘 1. 没有索引&#xff0c;可能会有什么问题 所以&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行正确的create index&#x…

Python 数据分析笔记— Numpy 基本操作

文章目录 学习内容&#xff1a;一、什么是数组、矩阵二、创建与访问数组三、矩阵基本操作 学习内容&#xff1a; 一、什么是数组、矩阵 数组&#xff08;Array&#xff09;&#xff1a;是有序的元素序列&#xff0c;可以是一维、二维、多维。 array1 [1,2,3] 或[a, b, c, d…

Littorine生物合成糖基转移酶和酰基转移酶-文献精读39

Functional genomics analysis reveals two novel genes required for littorine biosynthesis 功能基因组学分析揭示了两个Littorine生物合成所需的新基因&#xff0c;基因组挖掘很有效果~ 摘要 一些茄科药用植物能够生产药用莨菪烷类生物碱&#xff08;TAs&#xff09;&am…

MYSQL:简述对B树和B+树的认识

MySQL的索引使用B树结构。 1、B树 在说B树之前&#xff0c;先说说B树&#xff0c;B树是一个多路平衡查找树&#xff0c;相较于普通的二叉树&#xff0c;不会发生极度不平衡的状况&#xff0c;同时也是多路的。 B树的特点是&#xff1a;他会将数据也保存在非叶子节点。而这个…

样本存储需要注意的事项

在实验室和研究机构中&#xff0c;有一些样本是非常重要且需要特殊保护的&#xff0c;这些样本可能包括珍贵的细胞培养物、生物医学样本、药物试剂等等&#xff0c;为了保证这些样本的质量和完整性&#xff0c;采取一些特殊的措施来进行存储管理非常重要。 一旦这些珍贵样本出…

Undertow 性能、配置

一、性能对比 Tomcat vs Jetty vs Undertow性能对比,详细文章: Tomcat vs Jetty vs Undertow性能对比-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1699803压测指标的结果: 吞吐量:Undertow > Jetty > Tomcat响应时间&…

World of Warcraft [CLASSIC][80][Shushia] Call to Arms: Alterac Valley

Alterac Valley 奥特兰克山谷 明明能拿7000-9000荣誉&#xff0c;白送的大战场&#xff0c;废材太多&#xff0c;看不下去了&#xff0c;动不动就杀女人&#xff0c;丢墓地&#xff0c;最终拿什么3000荣誉&#xff0c;也不知道脑子装啥。 我们55级的时候就能把联盟打的不要不要…

物料类型 UNBW 和 NLAG

业务示例 公司的广告部门负责采购广告业务并承担相应的费用。这些宣传册不应该存储在广告部门&#xff1b;而应该存储在物料仓库中。并且需要基于数量而不是金额进行库存管理。因此这些物料的物料类型为未评估物料(UNBW)。 物料类型 UNBW 物料类型UNBW表示未评估物料。可以通…

第20讲 动画讲解轻松学会STM32的PWM

来源&#xff1a;【STM32】动画讲解轻松学会STM32的PWM_哔哩哔哩_bilibili 基本概念 周期/频率 计算公式&#xff1a;PWM周期1个高电平用时1个低电平用时 PWM的频率1/周期 如图所示此时周期为1ms&#xff0c;即1s内存在1000组这样的高低电平&#xff0c;PWM的频率为1000hz。…

selenium启动总报错 WebDriverManager总是异常

我的环境用这个自动管理驱动的工具 WebDriverManager 总是报错 尝试过很多方法都没有&#xff0c;只好手动指定浏览器的位置 System.setProperty("webdriver.chrome.driver", "C:\\Users\\27224\\.cache\\selenium\\chromedriver\\win64\\128.0.6613.84\\chrome…