牛客周赛 Round 35 解题报告 | 珂学家 | 构造 + 组合数学

2024-03-04 04:04

本文主要是介绍牛客周赛 Round 35 解题报告 | 珂学家 | 构造 + 组合数学,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

牛客周赛 Round 35 解题报告 | 珂学家 | 构造 + 组合数学


前言

alt


整体评价

F/G是数学题,E是一道有趣的构造题, 需要一点点空间想象力,其他几题也不错。不过整场被python的库函数,折磨得崩溃,T_T.


A. 小红的字符串切割

题型: 签到

s = input()
half = len(s) // 2print (s[0:half])
print (s[half:])

B. 小红的数组分配

思路: map应用+构造

map的一个应用,偶数肯定ok,奇数肯定没法构造

from collections import Counter
n = int(input())arr = list(map(int, input().split()))cnt = Counter(arr)arr1 = []
arr2 = []
ok = True
for (k, v) in cnt.items():if v % 2 == 1:ok = Falseelse:arr1.extend([k] * (v // 2))arr2.extend([k] * (v // 2))if ok:print (*arr1, sep = ' ')print (*arr2, sep = ' ')
else:print (-1)

C. 小红关鸡

思路: 双指针

排序后,双指针模拟,枚举然后取最大的覆盖点集数

n, k = list(map(int, input().split()))
arr = list(map(int, input().split()))res = 0.0arr.sort()
j = 0
for i in range(n):while j < n and arr[j] - arr[i] <= k:j += 1d = j - ires = max(res, d * 1.0 / n)print ("%.6f" % (res))

D. 小红的排列构造

思路: 模拟

把多的索引位置组成一个序列,然后把少的数字组成一个序列

然后zip一下,就出来了

n = int(input())
arr = list(map(int, input().split()))vis = [False] * (n + 1)more = []
for (i, v) in enumerate(arr):if v > n or vis[v]:more.append(i + 1)else:vis[v] = Truelack = []
for i in range(1, n + 1):if not vis[i]:lack.append(i)print (len(more))
for (k, v) in zip(more, lack):print (k, v)

E. 小红的无向图构造

思路: 构造

  • 先构建树结构,保证最短距离满足要求
  • 在满足边数

前一个相对简单,后一个需要一点点空间想象力

  1. 可以在同距离的点集合中,构建星状结构的边

  2. 在距离差1的两个点集合中,交叉构建边

这两种边,对之前点的最短距离,毫无影响

n, m = list(map(int, input().split()))
arr = list(map(int, input().split()))def solve(res):hp = set()def add(v1, v2):if v1 > v2:v1, v2 = v2, v1hp.add((v1, v2))res.append((v1, v2))def exist(v1, v2):if v1 > v2:v1, v2 = v2, v1return (v1, v2) in hp# 1. 满足点的距离tx = [(i, v) for (i, v) in enumerate(arr) if i != 0]tx.sort(key=lambda x: x[1])path = [[] for _ in range(n)]path[0].append(0)acc = 0far = 0for (p, v) in tx:if v <= far + 1:path[v].append(p)add(path[v - 1][-1], p)acc += 1else:return Falsefar = max(v, far)# 判定所需的边数是否大于要求if acc > m:return False# 2. 补充边的阶段#    2.1. 补充同距离的边j = 0while acc < m and j < n:brr = path[j]bn = len(brr)for si in range(bn):for sj in range(si + 1, bn):if acc == m: return Trueadd(brr[si], brr[sj])acc += 1j += 1#    2.2. 补充距离为1的点集合之间的边for i in range(n - 1):for e1 in path[i]:for e2 in path[i + 1]:if acc == m:return Trueif not exist(e1, e2):add(e1, e2)acc += 1return acc == mls = []
if solve(ls):for (p1, p2) in ls:print (p1 + 1, p2 + 1)
else:print (-1)

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

和G题,一起讲


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

思路: 经过公式的抽象提炼,可以归纳为 加权和 乘积

其实1的情况比较特殊

alt

def ksm(b, v):r = 1while v > 0:if v % 2 == 1:r = r * b % modv //= 2b = b * b % modreturn rclass Factorial:def __init__(self, N, mod) -> None:N += 1self.mod = modself.f = [1 for _ in range(N)]self.g = [1 for _ in range(N)]for i in range(1, N):self.f[i] = self.f[i - 1] * i % self.modself.g[-1] = pow(self.f[-1], mod - 2, mod)for i in range(N - 2, -1, -1):self.g[i] = self.g[i + 1] * (i + 1) % self.moddef fac(self, n):return self.f[n]def fac_inv(self, n):return self.g[n]def comb(self, n, m):if n < m or m < 0 or n < 0: return 0return self.f[n] * self.g[m] % self.mod * self.g[n - m] % self.moddef perm(self, n, m):if n < m or m < 0 or n < 0: return 0return self.f[n] * self.g[n - m] % self.moddef catalan(self, n):return (self.comb(2 * n, n) - self.comb(2 * n, n - 1)) % self.moddef inv(self, n):return self.f[n - 1] * self.g[n] % self.modn = int(input())
arr = list(map(int, input().split()))mod = 10 ** 9 + 7
n1, n2, n3 = arr.count(1), arr.count(2), arr.count(3)fac = Factorial(n, mod)s1 = ksm(2, n1)
s2 = sum([fac.comb(n2, i) * (i + 1) % mod for i in range(n2 + 1)])
s3 = sum([fac.comb(n3, i) * (i + 1) % mod for i in range(n3 + 1)])res = s1 * s2 * s3 % mod
res = (res - 1 + mod) % mod print (res)

写在最后

alt

这篇关于牛客周赛 Round 35 解题报告 | 珂学家 | 构造 + 组合数学的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/771947

相关文章

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op