首页 > 其他分享 >Acwing2024蓝桥杯递归

Acwing2024蓝桥杯递归

时间:2024-04-07 17:58:52浏览次数:26  
标签:return string 递归 int 蓝桥 ++ str Acwing2024 include

模板:

欧几里得算法

//若a,b互质则返回1,否则返回0
int gcd(int a, int b){
    return b ? gcd(b, a % b) : a;
}

题目:

AcWing 1360. 有序分数

暴力模拟法(AC):

#include<iostream>
#include<algorithm>
#define x first
#define y second
using namespace std;
int n;
typedef pair<int,int>pii;
pii num[100005];
bool cmp(pii a,pii b){
    return a.x*b.y<a.y*b.x;
}
int main(){
    //输入
    cin>>n;
    //暴力枚举每一种分数的情况(肯定有重复的可能)
    int k=0;
    for(int i=2;i<=n;i++){
        for(int j=1;j<i;j++){
            num[k].x=j;
            num[k].y=i;
            k++;
        }
    }
    //暴力去重,并且利用1/1进行标记
    int cnt=0;
    for(int i=0;i<k;i++){
        for(int j=i+1;j<k;j++){
            if(num[i].x*num[j].y==num[i].y*num[j].x){
                num[j].x=1,num[j].y=1;
            }
        }
    }
    //排序
    sort(num,num+k,cmp);
    //输出
    cout<<"0/1"<<endl;
    for(int i=0;i<k;i++){
        if(num[i].x==1&&num[i].y==1) break;     //遇见标记直接跳出循环
        else cout<<num[i].x<<"/"<<num[i].y<<endl;
    }
    cout<<"1/1"<<endl;
    return 0;
}

利用最大公约数模板改进暴力法(AC):

#include<iostream>
#include<algorithm>
#define x first
#define y second
using namespace std;
int n;
typedef pair<int,int>pii;
pii num[100005];
int gcd(int a,int b){      //最大公约数
    return b?gcd(b,a%b):a;
}
bool cmp(pii a,pii b){
    return a.x*b.y<a.y*b.x;
}
int main(){
    cin>>n;
    int cnt=0;
    //若最大公约数为1则存储
    for(int i=0;i<=n;i++){
        for(int j=0;j<=i;j++){
            if(gcd(i,j)==1){
                num[cnt++]={j,i};
            }
        }
    }
    //排序
    sort(num,num+cnt,cmp);
    //输出
    for(int i=0;i<cnt;i++){
        cout<<num[i].x<<"/"<<num[i].y<<endl;
    }
    return 0;
}

递归优化(AC);

#include<iostream>
using namespace std;
int n;
void dfs(int a,int b,int c,int d){
    if(b+d>n) return ;
    dfs(a,b,a+c,b+d);
    cout<<a+c<<"/"<<b+d<<endl;
    dfs(a+c,b+d,c,d);
}
int main(){
    cin>>n;
    cout<<"0/1"<<endl;
    dfs(0,1,1,1);
    cout<<"1/1"<<endl;
    return 0;
}

AcWing 1225. 正则问题(第八届省赛)

暴力模拟(AC):

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int len, a[100];
int judge(string temp) {
    int flag = 0, key = 0;
    for (int i = 0; i < temp.size(); i++) {
        if (temp[i] == '(') flag = 1;
        if (temp[i] == ')') key = 1;
        if (flag + key == 2) return 0;
    }
    return 1;
}
string fun(string str) {
    memset(a, 0, sizeof(a));
    int l = 0, r = 0;
    for (int i = 0; i < str.size(); i++) {
        if (str[i] == ')') {
            r = i;
            int flag = 0, k = 0;
            for (int j = r - 1; j >= 0; j--) {
                if(str[j]=='('){
                    l = j; break;
                }
                if (str[j] == '|') {
                    flag = 1;
                    a[k++] = j;
                }
            }
            if (flag == 0) {
                str.erase(r, 1); str.erase(l, 1);
            }
            else {
                a[k++] = l, a[k++] = r;
                sort(a, a + k);
                for (int i = 0; i < k - 1; i++) {
                    a[i] = a[i + 1] - a[i] - 1;
                }
                sort(a, a + k - 1);
                str.erase(l, r - l + 1);
                string tt = "x";
                while (a[k - 2]--) {
                    str.insert(l, tt);
                }
            }
            return str;
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    string s = ""; cin >> s;
    len = s.size();
    while (judge(s) == 0)
        s = fun(s);
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '(' || s[i] == ')') {
            s.erase(i, 1);
        }
    }
    memset(a, 0, sizeof(a));
    int j = 1; a[0] = -1;
    int flag = 0;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '|') {
            flag = 1;
            a[j++] = i;
        }
    }
    a[j] = s.size();
    for (int i = 0; i < j; i++)
        a[i] = a[i + 1] - a[i] - 1;
    sort(a, a + j);
    if (flag == 0) cout << s.size() << endl;
    else cout << a[j - 1] << endl;
    return 0;
}

这暴力我自己写出来都不想看......

递归优化(AC):

#include<iostream>
using namespace std;
int n;
string str;
int dfs(){
    int res=0;
    while(n<str.size()) {
        if(str[n]=='(') {
            n++;
            res+=dfs();
            n++;
        }
        else if(str[n]==')') break;
        else if(str[n]=='|') {
            n++;
            res=max(res,dfs());
        }
        else {
            n++;
            res++;
        }
    }
    return res;
}

int main(){
    cin>>str ;
    cout<<dfs();
    return 0 ;
}

AcWing 1225. 正则问题类似于洛谷P1928外星密码

P1928 外星密码

暴力模拟(AC):

#include<iostream>
using namespace std;
string str = "";
int len, l, r;
int judge(string a) {
	for (int i = 0; i < a.size(); i++)
		if (a[i] == '[')
			return 0;
	return 1;
}
string jieyasuo(string s) {
	len = s.size();
	for (int i = 0; i < len; i++) {
		if (s[i] == ']') {
			r = i;
			for (int j = r; j >= 0; j--) {
				if (s[j] == '[') {
					l = j;
					int cnt = 0;
					int ll = l;
					if (s[j + 2] >= '0' && s[j + 2] <= '9') {
						cnt = 10 * (s[j + 1] - '0') + (s[j + 2] - '0');
						ll += 2;
					}
					else {
						cnt = (s[j + 1] - '0');
						ll += 1;
					}
					string temp = "";
					for (int k = ll + 1; k < r; k++)
						temp += s[k];
					s.erase(l, r - l + 1);
					while (cnt--) {
						s.insert(l, temp);
					}
					temp.clear();
					return s;
				}
			}
		}
	}
}
int main() {
	cin >> str;
	while (judge(str) != 1)
		str = jieyasuo(str);
	cout << str << endl;
	return 0;
}

递归优化:

#include<iostream>
using namespace std;
string dfs(){
    string s1="";
    char ch;
    while(cin>>ch){
        if(ch=='['){
            int num;
            cin>>num;
            string s2=dfs();
            while(num--) s1+=s2;
        }
        else if(ch==']')
            return s1;
        else
            s1+=ch;
    }
    return s1;
}
int main(){
    cout<<dfs();
    return 0;
}

AcWing 1209. 带分数(第四届省赛)

#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int>pii;
pii part[100];
int ans[3],flag[9]={1,2,3,4,5,6,7,8,9};
int cnt,res;
//递归
void dfs(int x,int startt){
    if(x>2){
        part[cnt].first=ans[1];
        part[cnt].second=ans[2];
        cnt++;
        return ;
    }
    for(int i=startt;i<=8;i++){
        ans[x]=i;
        dfs(x+1,i+1);
        ans[x]=0;
    }
}
//计算区域内的数
int sum(int l,int r){
    int t=0;
    for(int i=l;i<r;i++) t=t*10+flag[i];
    return t;
}
int main(){
    //输入
    int n;cin>>n;
    //给一个区间划分两次,得三份
    dfs(1,1);
    //遍历每一次全排列
    do{
        int i=0;
        //遍历每一次划分
        for(i;i<cnt;i++){
            int a=sum(0,part[i].first);
            int b=sum(part[i].first,part[i].second);
            int c=sum(part[i].second,9);
            //判断答案
            if(n*c==a*c+b) res++;
        }
    }while(next_permutation(flag,flag+9));
    //输出
    cout<<res<<endl;
    return 0;
}

标签:return,string,递归,int,蓝桥,++,str,Acwing2024,include
From: https://blog.csdn.net/2301_76144982/article/details/137381432

相关文章

  • 第十四届蓝桥杯省赛大学B组填空题(c++)
    日期统计:暴力枚举+set(自带排序加去重)#include<iostream>#include<set>usingnamespacestd;set<int>ans;inta[100]={5,6,8,6,9,1,6,1,2,4,9,1,9,8,2,3,6,4,7,7,5,9,5,0,3,8,7,5,8,1,5,8,6,1,8,3,0,3,7,9,2,7,0,5,8,......
  • P8600 [蓝桥杯 2013 省 B] 连号区间数 and CF526F
    问题转化很容易就能把原问题转化成:求满足Max-Min=r-l的区间个数暴力解法根据上面得到的性质,我们可以暴力枚举区间,来判断当前区间是否满足性质#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#include<string.h>#def......
  • 蓝桥杯 历届真题 杨辉三角形【第十二届】【省赛】【C组】
    资源限制内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s思路:    由于我第一写没考虑到大数据的原因,直接判断导致只得了40分,下面是我的代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN......
  • 第十四届蓝桥杯省赛B组
    目录试题A:2023题解正确题解试题B:硬币兑换试题C:松散子序列题解:动态规划试题D:管道题解:二分+区间合并试题E:保险箱试题A:2023题解a='2023'cnt,i,k=0,0,0forjinrange(12345678,98765433):whilei<len(a):whilek<8:ifa[i]==str(j)[k]:......
  • 并查集——蓝桥杯备赛【python】
    一、合根植物试题链接:[蓝桥杯2017国C]合根植物问题描述星球的一个种植园,被分成m×n个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。如果我们告诉你哪些小......
  • 差分和前缀和——蓝桥杯备赛
    一、大学里的树木要打药问题描述教室外有N棵树,根据不同的位置和树种,学校要对其上不同的药。因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。树的编号从0∼N−1且N<1e6。对于树的药是成区间分布,比如3∼5号的树靠近下水道,所以他们要用驱蚊虫的药,20......
  • 蓝桥杯,省赛,动态规划专题,青蛙,更小的数,松散子序列,接龙数列
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+9;doublex[N],a[N],b[N];doubledp[N][5];intmain(){intn;cin>>n;for(inti=1;i<=n;i++)cin>>x[i];for(inti=1;i<=n-1;i++)cin>>a[i]>>b[i......
  • 蓝桥杯嵌入式2017年第八届省赛主观题解析
    1 题目2  代码/*USERCODEENDHeader*//*Includes------------------------------------------------------------------*/#include"main.h"#include"rtc.h"#include"tim.h"#include"gpio.h"/*Privateincludes--......
  • [蓝桥杯 2022 国 B] 齿轮(优化枚举)
        根据题目描述,如果采用dfs暴力做法枚举所有方案,肯定会超时,因此我们需要优化枚举,我们都知道在同一组共同转动的齿轮中,线速度相等,因此角速度的比值就是半径的反比,因此我们只需要找到对于每个齿轮作为起始齿轮,只需要找到其倍数半径是否存在即可,而倍数上限就是假设存在......
  • [蓝桥杯 2021 省 B] 杨辉三角形(二分查找+枚举)
        我们之前学过有关杨辉三角的一些性质,我们知道杨辉三角某个数等于左上和右上两个数相加,但是如果我们按照这个性质依次枚举每行每列,就会很容易超时,因此我们可以枚举列,再二分查找行来寻找满足要求的答案,我们可以先将列数到30,基本涵盖了所有的答案,通过组合数性质来二......