牛客巅峰赛S2第6场题解
牛客编程巅峰赛S2第6场
A-StringⅡ
题目
题目描述
给出一个仅包含小写字母的字符串s,你最多可以操作k次,使得任意一个小写字母变为与其相邻的小写字母(ASCII码差值的绝对值为1),请你求出可能的最长相等子序列(即求这个字符串修改至多k次后的的一个最长子序列,且需要保证这个子序列中每个字母相等)。
子序列:从原字符串中取任意多个字母按照先后顺序构成的新的字符串。
示例1
输入
2,"abcde"
返回值
3
示例2
输入
10,"acesxd"
返回值
4
备注:
数据满足:\(1\leq |s|\leq 2^{10}, 1\leq k \leq3000\),其中\(|s|\)表示字符串的长度。
思路
找到所有字符串中所有字符到每个字母的距离,排序。
找每个字母所能得到的最大长度。
代码
class Solution {
public:
/**
*
* @param k int整型 表示最多的操作次数
* @param s string字符串 表示一个仅包含小写字母的字符串
* @return int整型
*/
int string2(int k, string s) {
// write code here
sort(s.begin(), s.end());
int n = s.size();
vector<vector<int> > dist(26);
for(int i = 0; i < 26; i++){
for(int j = 0; j < n; j++){
dist[i].push_back(abs(i+'a'-s[j]));
}
}
for(int i = 0; i < 26; i++) sort(dist[i].begin(), dist[i].end());
int ans = 1;
for(int i = 0; i < 26; i++){
int sums = 0, p = 0;
while(p < n){
sums += dist[i][p++];
if(sums > k) break;
ans = max(ans, p);
}
//cout << sums << " " << p << endl;
//if(p == n) return n;
}
return ans;
}
};
B-Bang Bang
题目
题目描述
音游狂热爱好者牛牛接到了一个新的任务,那就是给一张乐谱设计重音符。每当玩家敲击重音符的时候就会发出"bang"的美妙声音!!
每一张乐谱都有\(n\)个音符从左到右一字排开,现在牛牛的任务就是选出其中\(m\)个音符将其标记为重音符,同时任意两个重音符之间都必须隔着至少\(k\)k个音符。
一个有意思的问题诞生了,请求出这样合法的设计方案种数,并输出答案对\(1000000007\)取模的结果。
示例1
输入
3,2,1
返回值
1
备注:
数据范围 \(3≤n≤1000,m(0≤m≤n),k(0≤k≤n)\)
思路
动态规划
一个位置只有两种可能:放重音符和不放重音符。
那么用\(dp[i][j]\)代表前\(j\)个字符中放了\(i\)个重音符可能的情况总数。
代码
const int mod = 1e9+7;
#define ll long long
class Solution {
public:
/**
*
* @param n int整型 乐谱总音符数
* @param m int整型 重音符数
* @param k int整型 重音符之间至少的间隔
* @return long长整型
*/
long long solve_bangbang(int n, int m, int k) {
// write code here
if(m == 0) return 1;
vector<vector<int> > dp(1010, vector<int>(1010, 0));
dp[0][0] = 1;
// 不是重音符
for(int i = 0; i <= n; i++) dp[1][i] = 1;
for(int i = 2; i <= m; i++){
for(int j = k + 2; j <= n; j++){
// 不放重音符和放重音符的和
dp[i][j] = (dp[i][j-1] + dp[i-1][j-k-1]) % mod;
}
}
long long res = 0;
for(int i = 1; i <= n; i++){
res = (res + dp[m][i]) % mod;
}
return res;
}
};
C-天花板
题目
题目描述
牛牛想知道\(\sum_{i=1}^n \left \lceil \frac{n}{i} \right \rceil\)的值是多少(式子中\(\left \lceil \frac{n}{i} \right \rceil\)表示向上取整),现在牛牛给你\(\mathit n\),请你告诉牛牛和是多少。
示例1
输入
10
返回值
33
备注:
\(1\leq n\leq 10^9\)
思路
比赛中一直在oeis中找公式,害,大意了啊
分块
模拟一遍样例:
1 2 3 4 5 6 7 8 9 10
10 5 4 3 2 2 2 2 2 1
可以得到\(\left \lceil \frac{n}{i} \right \rceil\)的值在一段区间里是不变的,那么只要找到区间的左右端点就行了。
左端点是很容易得到的。
右端点计算方法如下:
- 二分查找右边界
- 直接计算右边界
统计即为答案。
代码
#define ll long long
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param n int整型
* @return long长整型
*/
ll findr(ll n, ll i){
ll l = i, r = n;
ll ans = l;
while(l <= r){
ll mid = (l+r)/2;
int x = ceil(1.0 * n / i), y = ceil(1.0 * n / mid);
if(x <= y) {
l = mid + 1;
ans = mid;
}
else r = mid - 1;
}
return ans;
}
/*
** 1 2 3 4 5 6 7 8 9 10
** 10 5 4 3 2 2 2 2 2 1
*/
long long Sum(int n) {
// write code here
ll sums = 0;
ll j;
for(ll i = 1; i <= n; i = j + 1){
if(i == n) j = n;
else j = (n - 1) / ((n - 1) / i);
// j = find(n, i);
sums += ceil(1.0 * n / i) * (j-i+1);
}
return sums;
}
};
牛客巅峰赛S2第6场题解的更多相关文章
- 牛客编程巅峰赛S2第4场
牛客编程巅峰赛S2第4场 牛牛摆玩偶 题目描述 牛牛有\(n(2 \leq n \leq 10^5)(2≤n≤105)\)个玩偶,牛牛打算把这n个玩偶摆在桌子上,桌子的形状的长条形的,可以看做一维数轴 ...
- 牛客编程巅峰赛S2第10场 - 钻石&王者 C.牛牛的路径和 (位运算,dfs)
题意:给你节点数为\(n\)的树,每个节点都有自己的权值,求所有路径的上的点的权值按位与的和. 题解:题目给的数据很大,我们不能直接去找.因此我们可以枚举二进制\([1,20]\)的每一位,然后再枚举 ...
- 牛客编程巅峰赛S2第7场 - 钻石&王者 A.牛牛的独特子序列 (字符串,二分)
题意:给你一个字符串,找出一个类似为\(aaabbbccc\)这样的由连续的\(abc\)构成的子序列,其中\(|a|=|b|=|c|\),问字符串中能构造出的子序列的最大长度. 题解:这题刚开始一直 ...
- 牛客编程巅峰赛S2第3场 Tree VI (树,dfs)
题意:给你一个\(n\)个点的完全\(k\)叉树的先序遍历序列\(a\),还原这颗树并且求所有两个端点的异或和. 题解:用dfs在还原树的时候,把子节点和父亲节点的异或贡献给答案,对于每个节点,我们找 ...
- 2019牛客暑期多校第六场题解ABDJ
A.Garbage Classification 传送门 题意:给你两个串,第一个串s由小写字母组成,第二个串t由dwh组成,长度为26,分别表示字母a到z代表的字符.现在要你判断: 如果字符串中‘h ...
- 2019牛客暑期多校第五场题解ABGH
A.digits 2 传送门 题意:给你一个n,要求输出一个每一位数字之和能整除n且其本身也能整除n的数.n不超过100,要求的数不超过10000位数. 题解:直接将n输出n次. 代码: #inclu ...
- 牛客网多校第3场C-shuffle card 平衡树或stl(rope)
链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...
- 牛客小白赛1 F题三视图
链接:https://www.nowcoder.com/acm/contest/85/F来源:牛客网 题目描述 Etéreo 拿出家里的许多的立方体积木,堆成了一个三维空间中的模型.既然你高考选了技术 ...
- 牛客网多校第3场Esort string (kmp)
链接:https://www.nowcoder.com/acm/contest/141/E 来源:牛客网 题目描述 Eddy likes to play with string which is a ...
随机推荐
- 【应用程序见解 Application Insights】Application Insights 使用 Application Maps 构建请求链路视图
Applicaotn Insigths 使用 Application Maps 构建请求链路视图 构建系统时,请求的逻辑操作大多数情况下都需要在不同的服务,或接口中完成整个请求链路.一个请求可以经历 ...
- 使用netty实现im聊天
简书地址图文更清晰: https://www.jianshu.com/p/f455814f3c40 1.新建maven工程2.引入maven依赖 <dependencies> <de ...
- PHP修改css文件中的背景图片并下载到本地
扒网站当中一般css中的图片扒不下来,这个脚本就是用来下载这些图片到本地的 流程 1.获取css文件路径 2.打开文件逐行读取判断是否包含需要的图片 2.1 包含则 -进行截取直接获取到相对路径 2. ...
- Python调用Java(基于Ubuntu 18.04)
最近实习,需要使用Python编程,其中牵涉到一些算法的编写.由于不熟悉Python,又懒得从头学,而且要写的算法自己之前又用Java实现过,就想着能不能用Python调用Java.经过查找资料,方法 ...
- # Maven:Could not transfer artifact org.springframework:spring-webmvc:pom:。。。(系统找不到文件),从网上clone到本地的项目报红
解决办法: 确保maven配置正确,在maven的setting.xml配置文件中, 配置本地仓库路径 <localRepository>D:\Maven\文件名</localRep ...
- 解决git push出现error: failed to push some refs to 错误
错误截图 背景 码云上创建了空项目 本地项目绑定了远程仓库,尝试git push,然后报了错 解决办法 使用强制命令git pull origin master --allow-unrelated-h ...
- 安装tomcat for ubuntu linux差点没晕死我!
我滴个神!装ubuntu的tomcat差点没有晕死我!怎么回事呢? 应该说是装好了,执行了bin/startup.sh了,出现以下画面: Using CATALINA_BASE: /home/niew ...
- 命名管道FIFO及其读写规则
一.匿名管道的一个限制就是只能在具有共同祖先的进程间通信命名管道(FIFO):如果我们想在不相关的进程之间切换数据,可以使用FIFO文件来做这项工作注意:命名管道是一种特殊类型文件.利用命令:$ mk ...
- 预估Ceph集群恢复时间
一.前言 本章很简单,就是预估集群恢复的时间,这个地方是简单的通过计算来预估需要恢复的实际,动态的显示 二.代码 #!/usr/bin/env python # -*- coding: UTF-8 - ...
- 常见MFC函数
1.MFC常用函数:WinExec()ExitWindowsEx()GlobalMemoryStatus()GetSystemInfo()GetSystemDirectory()GetWindowsD ...