本文主要是介绍递归(蓝桥备赛),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
正则问题
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
一个由x()|组成的正则表达式。
输出格式
输出所给正则表达式能接受的最长字符串的长度。
数据范围
输入长度不超过100,保证合法。
输入样例:
((xx|xxx)x|(x|xx))xx
输出样例:
6
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
string s;
int k=0;
int dfs()
{int res=0;while(k<s.size()){if(s[k]=='('){k++;res+=dfs();k++;}else if(s[k]=='|'){k++;res=max(res,dfs());}else if(s[k]==')'){break;}else{k++;res++;}}return res;
}
int main()
{cin>>s;cout<<dfs()<<endl;return 0;
}
有序分数
给定一个整数 N,请你求出所有分母小于或等于 N,大小在 [0,1]范围内的最简分数,并按从小到大顺序依次输出。
例如,当 N=5 时,所有满足条件的分数按顺序依次为:
0/1,1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5,1/1
输入格式
共一行,包含一个整数 N。
输出格式
按照从小到大的顺序,输出所有满足条件的分数。
每个分数占一行,格式为 a/b,其中 a 为分子, b为分母。
数据范围
1≤N≤160
输入样例:
5
//洛谷1458
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> num;
int n;
vector<num> nums;
bool cmp(const num& a, const num& b)
{return (1.0 * a.first / a.second) < (1.0 * b.first / b.second) ;
}
int main()
{cin >> n;for(int i = 0; i <= n; i++){for(int j = 1; j <= n; j++){int sign = __gcd(i, j);if ((1.0 * i / j) >= 0 && (1.0 * i / j) <= 1){nums.push_back({i / sign, j / sign});}}}sort(nums.begin(), nums.end(), cmp);auto last = unique(nums.begin(), nums.end());//使用unique函数去除重复元素,并返回指向第一个重复元素之后位置的迭代器 nums.erase(last, nums.end());//使用 erase 函数删除重复元素 for(const auto& element : nums){cout << element.first << "/" << element.second << endl;}return 0;
}
这篇关于递归(蓝桥备赛)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!