[洛谷刷题3]

P10906 [蓝桥杯 2024 国 B] 合法密码

https://www.luogu.com.cn/problem/P10906

题目描述

小蓝正在开发自己的 OJ 网站。他要求网站用户的密码必须符合以下条件:

  1. 长度大于等于 8 8 8 个字符,小于等于 16 16 16 个字符。
  2. 必须包含至少 1 1 1 个数字字符和至少 1 1 1 个符号字符。

例如 lanqiao2024!+-*/06018((>w<))8 都是合法的密码。

12345678##**##**abc0!#lanqiao20240601!? 都不是合法的密码。

请你计算以下的字符串中,有多少个子串可以当作合法密码?只要两个子串的开头字符和末尾字符在原串中的位置不同,就算作不同的子串。

字符串为:

kfdhtshmrw4nxg#f44ehlbn33ccto#mwfn2waebry#3qd1ubwyhcyuavuajb#vyecsycuzsmwp31ipzah#catatja3kaqbcss2th

输入格式

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

输出格式

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解题思路

直接对s的所有长度为8-16的字串进行判断否满足条件即可(结果是400)。

AC Code
#include<bits/stdc++.h>
using namespace std;

bool check(string s){
	int a = 0,b = 0;
	for(int i=0;i<s.size();i++){
		if(s[i]>='0'&&s[i]<='9'){
			a=1;
		}
		if(s[i]=='#') {
			b=1;
		}
	}
	if(a+b==2) {
		return true;
	}
	return false;
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    
    string s="kfdhtshmrw4nxg#f44ehlbn33ccto#mwfn2waebry#3qd1ubwyhcyuavuajb#vyecsycuzsmwp31ipzah#catatja3kaqbcss2th";
	int ans=0;
	for(int i=0;i<s.size();i++){
		for(int j=8;j<=16;j++){
			if(i+j <= s.size() && check(s.substr(i,j))){
				ans++;
			}
		}
	}
	cout << ans;
	return 0;
}

P10908 [蓝桥杯 2024 国 B] 选数概率

题目描述

一个数组中有 a a a 1 1 1 b b b 2 2 2 c c c 3 3 3。设 P i , j P_{i,j} Pi,j 表示在数组中随机选取两个数,其中一个数为 i i i,另一个数为 j j j 的概率。比如 P 1 , 2 = a b C ( a + b + c , 2 ) P_{1,2} = \dfrac{ab}{C(a+b+c,2)} P1,2=C(a+b+c,2)ab,其中 C ( N , M ) C(N, M) C(N,M) 为组合数,表示从 N N N 个不同元素中任取 M M M 个的方案数。

a = ? , b = ? , c = ? a=\text{?},b=\text{?},c=\text{?} a=?,b=?,c=? 时,满足 P 1 , 2 = 517 2091 , P 2 , 3 = 2632 10455 , P 1 , 3 = 308 2091 P_{1,2}=\dfrac{517}{2091},P_{2,3}=\dfrac{2632}{10455},P_{1,3}=\dfrac{308}{2091} P1,2=2091517,P2,3=104552632,P1,3=2091308,且 a + b + c a + b + c a+b+c 最小。保证 a + b + c a + b + c a+b+c 最小的解是唯一的。

你需要提交一个格式为 a , b , c a,b,c a,b,c 的字符串。例如假设你计算的结果是 a = 12 , b = 34 , c = 56 a =12, b = 34, c = 56 a=12,b=34,c=56,那么你需要提交的字符串是 12,34,56

输入格式

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

输出格式

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解题思路

由题,我们有:
{ a b C ( a + b + c , 2 ) = 517 2091 b c C ( a + b + c , 2 ) = 2632 10455 a c C ( a + b + c , 2 ) = 308 2091 \left\{\begin{array}{l}\frac{ab}{C(a+b+c,2)} = \frac{517}{2091} \\\frac{bc}{C(a+b+c,2)} = \frac{2632}{10455} \\\frac{ac}{C(a+b+c,2)} = \frac{308}{2091}\end{array}\right. C(a+b+c,2)ab=2091517C(a+b+c,2)bc=104552632C(a+b+c,2)ac=2091308

两两相除可以得到:
{ b c = 517 308 = 47 28 a b = 2091 2632 = 55 94 c a = 10455 517 = 56 55 \left\{ \begin{array}{l} \frac{b}{c} = \frac{517}{308} = \frac{47}{28} \\ \frac{a}{b} = \frac{2091}{2632} = \frac{55}{94} \\ \frac{c}{a} = \frac{10455}{517} = \frac{56}{55} \end{array} \right. cb=308517=2847ba=26322091=9455ac=51710455=5556

a : b : c = 55 : 94 : 56 a:b:c = 55:94:56 a:b:c=55:94:56。由于要让 a + b + c a+b+c a+b+c 最小,直接取 a = 55 a = 55 a=55 b = 94 b = 94 b=94 c = 56 c = 56 c=56 即可。

AC Code
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cout<<"55,94,56";
    return 0;
}

P10910 [蓝桥杯 2024 国 B] 最小字符串

https://www.luogu.com.cn/problem/P10910

题目描述

给定一个长度为 N N N 且只包含小写字母的字符串 S S S,和 M M M 个小写字母 c 1 , c 2 , ⋯   , c M c_1, c_2, \cdots, c_M c1,c2,,cM。现在你要把 M M M 个小写字母全部插入到字符串 S S S 中,每个小写字母都可以插入到任意位置。

请问能得到的字典序最小的字符串是什么?

输入格式

第一行包含两个整数 N N N M M M

第二行包含一个长度为 N N N 的字符串 S S S
第三行包含 M M M 个小写字母 c 1 , c 2 , ⋯   , c M c_1, c_2, \cdots, c_M c1,c2,,cM

输出格式

输出一个长度为 N + M N + M N+M 的字符串代表答案。

输入输出样例 #1

输入 #1

4 3
abbc
cba

输出 #1

aabbbcc

输入输出样例 #2

输入 #2

7 3
lanqiao
bei

输出 #2

beilanqiao

说明/提示

【评测用例规模与约定】

对于 20 % 20\% 20% 的评测用例, M = 1 M = 1 M=1
对于 100 % 100\% 100% 的评测用例, 1 ≤ N , M ≤ 1 0 5 1 \le N, M \le 10^5 1N,M105

解题思路

先对c(需要插入的字符串)字符串进行升序排序,随后直接进行输出:

  • s[i]>c[j],则输出c[j]j++
  • s[i]<=c[j],则输出s[i]i++

然后输出剩余的字符串即可。

AC Code
#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

    string s,c;
    int n,m;
    cin >> n >> m >> s >> c;
    sort(c.begin(),c.end());
    int i = 0,j = 0;
    while(i<n&&j<m){
        if(s[i]>c[j]){
            cout << c[j++];
        }
        else if(s[i]<=c[j]){
            cout << s[i++];
        }
    }
    while(i<n){
        cout << s[i++];
    }
    while(j<m){
        cout << c[j++];
    }
    return 0;
}

P8700 [蓝桥杯 2019 国 B] 解谜游戏

题目背景

题目描述

小明正在玩一款解谜游戏。谜题由 24 24 24 根塑料棒组成,其中黄色塑料棒 4 4 4 根,红色 8 8 8 根,绿色 12 12 12 根 (后面用 Y 表示黄色、R 表示红色、G 表示绿色)。初始时这些塑料棒排成三圈,如上图所示,外圈 12 12 12 根,中圈 8 8 8 根,内圈 4 4 4 根。

小明可以进行三种操作:

  1. 将三圈塑料棒都顺时针旋转一个单位。例如当前外圈从 0 0 0 点位置开始顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么顺时针旋转一次之后,外圈、中圈、内圈依次变为:GYRYGRYGRGGGYRGRGGRRRGGG
  2. 将三圈塑料棒都逆时针旋转一个单位。例如当前外圈从 0 0 0 点位置开始顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么逆时针旋转一次之后,外圈、中圈、内圈依次变为:RYGRYGRGGGGYGRGGRRYRGGRG
  3. 将三圈 0 0 0 点位置的塑料棒做一个轮换。具体来说:外圈 0 0 0 点塑料棒移动到内圈 0 0 0 点,内圈 0 0 0 点移动到中圈 0 0 0 点,中圈 0 0 0 点移动到外圈 0 0 0 点。例如当前外圈从 0 0 0 点位置开始顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么轮换一次之后,外圈、中圈、内圈依次变为:RRYGRYGRGGGGGGRGGRRYYGGR

小明的目标是把所有绿色移动到外圈、所有红色移动中圈、所有黄色移动到内圈。给定初始状态,请你判断小明是否可以达成目标?

输入格式

第一行包含一个整数 T T T,代表询问的组数。 ( 1 ≤ T ≤ 100 ) (1 \le T \le 100) (1T100)

每组询问包含 3 3 3 行:

第一行包含 12 12 12 个大写字母,代表外圈从 0 0 0 点位置开始顺时针每个塑料棒的颜色。

第二行包含 8 8 8 个大写字母,代表中圈从 0 0 0 点位置开始顺时针每个塑料棒的颜色。

第三行包含 4 4 4 个大写字母,代表内圈从 0 0 0 点位置开始顺时针每个塑料棒的颜色。

输出格式

对于每组询问,输出一行 YES 或者 NO,代表小明是否可以达成目标。

输入输出样例 #1

输入 #1

2
GYGGGGGGGGGG
RGRRRRRR
YRYY
YGGGRRRRGGGY
YGGGRRRR
YGGG

输出 #1

YES
NO

说明/提示

蓝桥杯 2019 年国赛 B 组 H 题。

解题关键

内圈周期为 4,中圈周期为 8,外圈周期为 12,共同的周期为 4。所以对于内圈的一个塑料棒,如下图,与其他 5 个塑料棒是固定不变的,只能与这 5 个交换。
图
若这 6 个塑料棒的的颜色刚好为 3 个绿色,2 个红色和 1 个黄色时,操作三是一定可以变成目标状态的;否则无论怎么交换,始终是那些颜色,不可能到达目标状态的。

AC Code
#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int t;
    cin >> t;
    unordered_map<char,int> mp;
    while(t--){
        string a,b,c;
        cin >> a >> b >> c;
        int flag = 1;
        for(int i=0;i<4;i++){
            mp.clear();//记得清除!!!!!!
            mp[a[i]]++;
            mp[b[i]]++;
            mp[c[i]]++;
            mp[a[i+4]]++;
            mp[a[i+8]]++;
            mp[b[i+4]]++;
            if(mp['Y']!=1||mp['R']!=2||mp['G']!=3){
                flag=0;
                break;
            }
        }
        cout << (flag ? "YES" : "NO") << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Almond_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值