蓝桥杯 基础练习 Sine之舞 【递归简单运用】

来源:互联网 发布:app打包网站源码 编辑:程序博客网 时间:2024/05/21 22:29

基础练习 Sine之舞

时间限制:1.0s 内存限制:512.0MB
提交此题 锦囊1 锦囊2

问题描述

  最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
  不妨设
  An=sin(1–sin(2+sin(3–sin(4+…sin(n))…)
  Sn=(…(A1+n)A2+n-1)A3+…+2)An+1
  FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。

输入格式

  仅有一个数:N<201。

输出格式

  请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。

样例输入

3

样例输出

((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1

题意 : 已知:
An=sin(1sin(2+sin(3sin(4+sin(n)))
Sn=((A1+n)A2+n1)A3++2)An+1
给你一个n,让你求Sn

分析: 简单的递归,但是递归会超时哦,要记忆化一下,我这里直接先递推预处理下,然后跑下深搜即可

坑点: 由于这题的数据太水啦,完全可以水过去,但还是认真做吧

参考代码

#include<bits/stdc++.h>using namespace std;string pre[201];string a[201];int n;string get(int x) {    string res;    while (x) {        res = (char)('0' + x % 10) + res;        x /= 10;    }    return res;}void init() {    for(int i = 1;i <= n;i++) {        pre[i] = "sin(" + get(i) + ")";    }    a[1] = pre[1];    for(int i = 2;i <= n;i++) {        string temp = a[i-1].substr(0,a[i-1].size() - i + 1);        if(i&1) {            a[i] = temp + "+" + pre[i];            for(int j = 1;j < i;j++)                a[i] += ")";        } else {            a[i] = temp + "-" + pre[i];            for(int j = 1;j < i;j++)                a[i] += ")";        }    }}string dfs(int idx,int n) {    if(n == 1) return a[1] + "+" + (char) ('0' + idx);    return "(" + dfs(idx + 1,n-1) + ")" + a[n] + "+" + (char)('0' + idx);}int main(){    ios_base::sync_with_stdio(0);    cin>>n;    init();    cout<<dfs(1,n)<<endl;    return 0;}