目录
字符串的解码
难度:黄金
时间限制:2秒四:占用内存:256 M
给你一个字符串,由[,],数字和大写字母组成,现要求对其解码字符串中形如[DX],表示D个连续的X,例如[4cB]或[2[2cB]]都可以表示-旦出现括号就会有数字,且为正整数,会有两组方括号相邻的情况,如[4AJ[5B]
格式
输入格式:一行字符串
输出格式:一行字符串
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
using namespace std;
const int N=1e6 +7;
string s;
int len;
void f(int u) {
if (u == len || s[u] == ']')
return;
if (s[u] == '[') {
u++;
int num = 0;
while (s[u] >= '0' && s[u] <= '9') {
num = num * 10 + s[u] - '0';
u++;
}
while (num--)
f(u);
int tmp = 1;
while (tmp) {
if (s[u] == '[')
tmp++;
else if (s[u] == ']')
tmp--;
u++;
}
f(u);
} else {
while (s[u] >= 'A' && s[u] <= 'Z') {
cout << s[u];
u++;
}
f(u);
}
}
int main() {
cin >> s;
len = s.length();
f(0);
return 0;
}
数字问题
难度:黄金
时间限制:1秒
巴占用内存:128M
输入n,输出1一n的自然数中各数位只包含0或1的数的个数。
格式
输入格式:输入一个整型数字n(1≤n≤1e9)
输出格式:输出一行一个整数表示答案
样例1
输入:19
输出:3
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
using namespace std;
int n;
int ans =0;
void f(int m){
if (m>n)
return;
else
ans++;
f(m * 10);
f(m * 10 + 1);
}
int main() {
scanf("%d", &n);
f(1);
printf("%d", ans);
return 0;
}
字符矩阵
难度:钻石
时间限制:1秒巴:占用内存:128 M
给你一个n*m 的小写字符矩阵,你可以选择删除一些列,使得剩下的字符矩阵的每一行的字符串从上到下的字典序非减。即字符串s和t具有相等的长度,s在字典上大于t并且s中8和t的最大公共前缀(前缀可能为空)之后的字符按字母顺序大于t的相应字符。
求最少删除多少列?
格式
输入格式:第一行输入两个整数 n,m 接下来 n 行每行输入 m 个字符。
输出格式:输出一个整数表示最少删除的列。
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
using namespace std;
const int N = 1e2 +7;
string s[N];
int a [N];
int n,m;
int ans;
int main(){
cin >>n >>m;
for (int i=0;i<n;i++)
cin >>s[i];
for(int i =0;i<m;i++){//扫描每-列
int flag =0;
for(int j = 1;j < n;j++)//看是否存在下面比上面字典序小的情况
if(s[j][i] < s[j-1][i] && !a[j]){
flag =1;
break;
}
if (flag) {//如果存在,结果+1
ans++;
}else{
for (int j=1;j<n;j++)
if(!a[j] && s[j][i] > s[j-1][i])
a[j]=1;
}
}
cout <<ans <<endl;
return 0;
}
移水造海
难度:钻石○时间限制:1秒
巴占用内存:128M
今天,无聊的小码哥打开了他的,他突发奇想,"我要把一个新世界的一块大陆用水桶运水填成
海",尽管这个点子无聊透顶,但他真的去做了。
由于小码哥使用了修改器,他拥有了无限的水桶。一个水桶的水能够刚好填上一块格子。但如果倒
入水后水位高于两边中一边土地,那么水会溢出,这桶水相当于没倒过。
另外,世界左右两侧是虚空,水碰到虚空会消失。
现在给了你这个世界的地形图,告诉你这个世界的宽度以及每一列的土地的高度h,问你至少
要多少水桶的水才能填满这个世界(填满即无论在哪里倒一桶水都会溢出)。
格式
输入格式:第一行一个正整数,表示世界的宽度;
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
using namespace std;
int a[10005];
int main(){
int n,maxn = 0,ans =0;
cin >> n;
for (int i=0;i<n;i++){
cin >> a[i];
maxn = max(maxn,a[i]);
}
for(int i = 1;i<=maxn;i++) {//-一层-层遍历
int last = -1;
for (int j = 0; j < n; j++) {
if (a[j] >= i) {
if (last != -1)
ans += j - last - 1;
last = j;
}
}
}
cout <<ans;
return 0;
}
斐波那契,但是是字符串
难度:黄金
时间限制:1秒
巴占用内存:128M
现在有字符串组:
第0项ao="IAKIOI";
第1项a1="WHENWILLSCORLLOFTAIWUCOMEOUT!!!":
之后的第k项由第k一2项+第k一1项构成。
问第n项字符串的第c个字符是什么。
格式
输入格式:两个整数几,c意义如题
输出格式:一个字符表示答案
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
using namespace std;
#define ll long long
string a0 ="IAKIOI";
string a1 = "WHENWILLSCORLLOFTAIWUCOMEOUT!!!";
ll len[85],n,c;
void find(ll n,ll c){
if(n==0){
cout <<a0[c - 1];
return;
}
if(n==1) {
cout << a1[c - 1];
return;
}
if (c <= len[n -2])
find(n - 2,c);
else
find(n - 1,c-len[n - 2]);
}
int main() {
cin >> n >> c;
len[0] = a0.length();
len[1] = a1.length();
for (int i = 2; i <= n; i++)
len[i] = len[i - 2] + len[i - 1];
find(n, c);
return 0;
}
伯兰语
少 难度:黄金时间限制:1秒巴 占用内存:64 M
伯兰语有五个元音字母,分别是a,e,u。伯兰语单词中的每一个非元音i,o,(除了n)后都是元音(没有字母也不行,即单词末尾必须是a,n 这六个字符之一)。而元音和n没有此限制。i0,u,e如harakirhorsekingmyman和都是壟袈Σh邰符合规范的,而nbo都不符合。给你一个单词,问是否符合伯兰语单词的规范。nz格式输入格式:输入仅一行,是你需要判断是否符合规范的单词。
输出格式:输出仅一行,若符合则输出YES否则输出NO
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
using namespace std;
char ch[110];
char ss[5]={'a','e','i','o','u'};//元音表
bool pd(int i)
//判断元音
{
for (int j = 0; j < 5; j++) {
if (ch[i] == ss[j])
return true;
}
return false;
}
int main() {
cin >> ch;
int len = strlen(ch);//提取长度
bool flag = true;
for (int i = 0; i < len - 1; i++) {
if (!pd(i) && !pd(i + 1) && ch[i] != 'n')//判断
flag = false;
}
if (!pd(len - 1) && ch[len - 1] != 'n')
flag = false;
if (flag)
cout << "YES";
else
cout << "NO";
return 0;
}
换换换
难度:钻石时间限制:1秒四 占用内存:128 M
机器人小R在看一个魔术表演,魔术师面前有一排共N 个倒扣着的杯子,其中每一个下面都有个小玩具 t,并且每个小玩具都是唯一的。魔术师飞快地变换杯子之后让小R猜其中M个玩具在哪个杯子里。由于机器人小R内置的程序只能记录杯子的数量N,小玩具初始的位置p,以及魔术师每次变换杯子的位置 ,P2。小R的主人希望你能写一个程序,帮助小R找出玩具。
格式
输入格式:第一行给定三个整数 ,M,T,T 为魔术师操作的次数;接下来的 N 行,每行给定一个字符串 t;;之后的 T 行,每行给定两个位置 p1,P2,位置从1开始计数,最后 M 行,每行给定一个字符串 t。
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
#define N 50005
using namespace std;
int n,m,t;
string s[N];
map<string,int>mp;
int main(){
string tmp;
cin >>n >>m >>t;
for(int i = 1; i<=n ;i++) {
cin >> tmp;
s[i] = tmp;
mp[tmp] = i;
}
while (t--) {
int p1, p2;
cin >> p1 >> p2;
swap(s[p1], s[p2]);
swap(mp[s[p1]], mp[s[p2]]);
}
while(m--){
cin >>tmp;
cout<< mp[tmp]<<endl;
}
return 0;
}
银行账户
难度:黄金时间限制:1秒巴: 占用内存:128 M7
据说对银行账户进行盗窃时,如果只盗取小数点下的数值,就不容易引起注意,所以你决定进行尝试。
银行总共有几个账户,m次转账,对每次转账,你可以盗取(转账金额-转账金额下取整)的资金,并使转入账户的警戒值增加相同数值,当任意账户的警戒值>1,或者无法实现转账(转出账户余额不足),或者m 次转账全部完成,你停止盗取,请计算总盗取金额。
格式
输入格式:第一行 n,m,表示有几个账户,m 条转账记录,第二行 几 个实数,表示每个账户的资金;
接下来 m 行,每行有三个参数;
整数 x,整数y,实数之,分别表示转出账户,转入账户,和转账金额。
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
using namespace std;
struct accont{
double count;
double warn;
}a[1005];
int main() {
int n, m;
int flag = 0;
double ans = 0;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%lf", &a[i].count);
a[i].warn = 0;
}
int x, y;
double z;
for (int i = 1; i <= m; ++i) {
scanf("%d%d%lf", &x, &y, &z);
if (a[x].count < z)
break;
a[x].count -= z;
a[y].count += floor(z);
ans += z - floor(z);
a[y].warn += z - floor(z);
if (a[y].warn > 1)
break;
}
printf("%.2lf\n", ans);
return 0;
}
硬币塔
黄金时间限制:1秒巴:占用内存:128 M难度:
一个k级的硬币塔从下到上,由1个银币,一个k-1级硬币塔,k个金币,一个k-1级硬币塔,1个银币堆成。其中,0级硬币塔只有一个金币。
问:n级硬币塔从下向上数i个有几个金币
格式
输入格式:一行用空格隔开的两个整数 n,i
输出格式:\整数表示答案
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll coin[45],gold [45];
ll find(ll n,ll i) {
if (i == 0)
return 0;
if (n == 0)
return 1;
if (1 >= i)
return 0;
if (coin[n - 1] + 1 >= i)
return find(n - 1, i - 1);
if (coin[n - 1] + n + 1 >= i)
return gold[n - 1] + i - coin[n - 1] - 1;
if (coin[n - 1] * 2 + n + 1 >= i)
return gold[n - 1] + n + find(n - 1, i - n - 1 - coin[n - 1]);
return gold[n];
}
int main(){
ll n,i;
cin >> n >> i;
coin[0] = gold [0]=1;
for (int k=1;k <=n;k++){
coin[k] = coin[k - 1] *2 +k+ 2;
gold[k] = gold[k -1] * 2 + k;
}
cout <<find(n,i);
return 0;
}
巨大的错误
难度:黄金时间限制:1秒巴 占用内存:128 M
提瓦特大陆上有一个贫穷的占星术士小码哥,在占星的时候,小码哥时常需要将命运启示他的信息与手中命运之轮上的命星一一对应,现在有几个启示和几个命星需要一一对应,有时,因为命运实在太过难以言明,小码哥会将所有的启示与命星都对应错了,此时称小码哥犯了一个巨大的错误,问一共有多少种情况可被称为"巨大的错误"
格式)
输入格式:输入一个正整数 n
输出格式:输出一个正整数代表所求答案
cpp
//
// Created by abner on 2024/2/26.
//
//错排公式的应用
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll a[21]={0,0,1};
int main(){
int n;
cin >>n;
for (int i=3;i<=n;i++)
a[i]=(i-1)*(a[i-2]+a[i-1]);
cout <<a[n];
return 0;
}
三角形的个数
难度:钻石时间限制:1秒巴 占用内存:128 M
最近璃月的海灯节到了,一位来自码蹄集的小码哥正好游历至此,一种有趣的装饰图案引起了他的兴趣:这种图案将一个三角形每条边分为几等分,然后将对应的等分点相连,使得连成的线段平行于三条边中的一条,这样就构成了大三角套小三角的繁复图案。现在有许多类似的图案,这名学者想知道每个图案中各包含了几个三角形,请你帮帮他。
如图所示是一个二等分的例子:
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
using namespace std;
int f(int n){
if (n == 1)
return 0;
if (n ==2)
return 1;
return (n - 1) * n/2+f(n -2);
}
int main(){
int n,N;
cin >> N;
while (N--) {
cin >> n;
int sum1 = 0, sum2 = 0;
for (int i = 1; i <= n; i++) {
sum1 += (n - i +1) * (n - i + 2) / 2;
}
sum2 = f(n);
cout << sum1 + sum2 << endl;
}
return 0;
}
奇怪的和
号难度:钻石
0时间限制:1秒
巴占用内存:128M
给出两个整数n,m,和一个n×m的矩阵。若该矩阵中两元素相同,sum(初始为零)就加上
它们所在位置的曼哈顿距离。求sum
的值。
格式
输入格式:第一行为两个正整数n,m;
之后的n行表示n*m的矩阵。
输出格式:一个数表示答案。
cpp
//
// Created by abner on 2024/2/26.
//
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 +7;
int n,m;
struct POSITION{
int x,y;
};
vector<POSITION>v[N];
int ans;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
int num;
cin >> num;
v[num].push_back({i, j});
int len = v[num].size();
for (int k = 0; k < len; k++)
ans += abs(v[num][k].x - i) + abs(v[num][k].y - j);
}
cout << ans << endl;
return 0;
}