AcWing 第 90 场周赛

A.4806. 首字母大写

题目描述:

给定一个由大小写字母构成的单词。
如果单词的首字母为小写字母,则请你将该首字母转换为对应大写字母。
如果单词的首字母为大写字母,则不做任何变化。
输出最终的单词。

输入格式:

一个由大小写字母构成的非空字符串,表示给定单词。

输出格式

输出最终的单词。

数据范围

前 3 个测试点满足,输入单词长度范围 [ 1 , 10 ] [1,10] [1,10]
所有测试点满足,输入单词长度范围 [ 1 , 1000 ] [1,1000] [1,1000]

输入样例1:
ApPLe
输出样例1:
ApPLe
输入样例2:
konjac
输出样例2:
Konjac

算法模拟

大写不变,小写转换成大写

Ac code

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string s; cin >> s;
if(s[0] <= 'z' && s[0] >= 'a') s[0] -= 32;
cout << s << endl;
return 0;
}

运行结果

结果: Accepted
通过了 10/10个数据
运行时间: 10 ms
运行空间: 220 KB

B.4807. 找数字

题目描述:

给定一个正整数 m m m 和一个非负整数 s s s
请你找到长度为 m 且各位数字之和为 s s s 的最小和最大非负整数。
要求所求非负整数不得包含前导零。

输入格式:

共一行,两个整数 m , s m,s m,s

输出格式

在一行内输出满足条件的最小和最大非负整数。
如果无解,则输出 -1 -1

数据范围

6 6 6 个测试点满足 1 ≤ m ≤ 3 1≤m≤3 1m3
所有测试点满足 1 ≤ m ≤ 100 , 0 ≤ s ≤ 900 1≤m≤100,0≤s≤900 1m1000s900

输入样例1:
2 15
输出样例1:
69 96
输入样例2:
3 0
输出样例2:
-1 -1

算法 贪心、数学、构造

特判:数位和最大为9 * m, 最小为 1 ,如果m = 1, 数位和可以是 0
构造最小数:从最后一位到第二位进行构造,每一位是 t = max(9, sum - 1), sum -= t
因为至少要留 1 给最高位,最后最高位就是 sum
构造最大数:从第一位开始构造,每一位是 t = min(9, sum), sum -= t

Ac code

#include<bits/stdc++.h>
using namespace std;
int main()
{
int m, s;
cin >> m >> s;
if(s > 9 * m || m > 1 && s < 1) cout << -1 << ' ' << -1; // 特判
else
{
vector<int> a(m + 1);
// 从最后一位到第二位构造最小数
int sum = s;
for(int i = m; i >= 2; i --)
{
int t = min(9, sum - 1);
a[i] = t;
sum -= t;
}
a[1] = sum; // 最高位
// 输出最小数
for(int i = 1; i <= m; i ++) cout << a[i];
cout << ' ';
a.clear();
// 从第一位开始构造最大数
sum = s;
for(int i = 1; i <= m; i ++)
{
int t = min(9, sum);
a[i] = t;
sum -= t;
}
// 输出最大数
for(int i = 1; i <= m; i ++) cout << a[i];
}
return 0;
}

运行结果

结果: Accepted
通过了 22/22个数据
运行时间: 26 ms
运行空间: 216 KB

C.4808. 构造字符串

题目描述:

给定一个长度为 n n n 的由小写字母构成的字符串 t t t 以及一个整数 k k k
请你构造一个字符串 s s s,要求:
1.字符串 s s s 恰好有 k k k 个子串等于字符串 t t t
2.字符串 s s s 的长度尽可能短。
保证一定存在唯一解。

输入格式:

第一行包含两个整数 n , k n,k n,k
第二行包含一个长度为 n n n 的由小写字母构成的字符串 t t t

输出格式

输出满足条件的字符串 s s s
保证一定存在唯一解。

数据范围

前 3 个测试点满足 1 ≤ n , k ≤ 4 1≤n,k≤4 1n,k4
所有测试点满足 1 ≤ n , k ≤ 50 1≤n,k≤50 1n,k50

输入样例1:
3 4
aba
输出样例1:
ababababa
输入样例2:
3 2
cat
输出样例2:
catcat

算法贪心、KMP(模拟)

贪心得出即求:最长公共前后缀

Ac code 1KMP求next数组 O ( n ) O(n) O(n)

// next[i] : 从第一个字符到当前字符所在串的最长公共前后缀长度
#include<iostream>
using namespace std;
const int N = 55;
int n, k;
int ne[N];
char p[N];
int main()
{
scanf("%d%d", &n, &k);
scanf("%s", p + 1);
for(int i = 2, j = 0; i <= n; i ++)
{
while(j && p[i] != p[j + 1]) j = ne[j];
if(p[i] == p[j + 1]) j ++;
ne[i] = j;
}
printf("%s", p + 1);
for(int i = 1; i <= k - 1; i ++)
printf("%s", p + 1 + ne[n]);
return 0;
}

运行结果

结果: Accepted
通过了 15/15个数据
运行时间: 15 ms
运行空间: 220 KB

Ac code 2模拟(substr函数) O ( n 2 ) O(n^2) O(n2)

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n, k; cin >> n >> k;
string s; cin >> s;
int res = 0;
// 每一次 substr 都是 O(n)
for(int len = 1; len <= n - 1; len ++)
if(s.substr(0, len) == s.substr(n - len, len))
res = max(res, len);
cout << s;
for(int i = 1; i <= k - 1; i ++) cout << s.substr(res);
// substr函数第二参数缺省默认为从当前位置到最后
return 0;
}

运行结果

结果: Accepted
通过了 15/15个数据
运行时间: 16 ms
运行空间: 216 KB
版本号

1.0 1.0 1.0 修改于 2023.2.10 2023.2.10 2023.2.10

posted @   Mr_Dwj  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示