【AcWing】递推(就是那种很棘手的题)

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 【AcWing】递推(就是那种很棘手的题),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

🎆音乐分享 

盗墓笔记·十年人间(八一七稻米节主题推广曲) – 李常超 (Lao乾妈)
 


【AcWing】递推(就是那种很棘手的题)

 

1208. 翻硬币 – AcWing题库

【AcWing】递推(就是那种很棘手的题)

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

int n;
char start[N], aim[N];

void turn(int i)
{
    if (start[i] == '*') start[i] = 'o';
    else start[i] = '*';
}

int main()
{
    cin >> start >> aim;
    n = strlen(start);

    int res = 0;
    for (int i = 0; i < n - 1; i ++ )
        if (start[i] != aim[i])
        {
            turn(i);//反转
            turn(i + 1);
            res ++ ;
        }

    cout << res << endl;
    return 0;
}

3777. 砖块 – AcWing题库

 这个题,就是不看来源我就知道是cf的题(不要问我为什么)

【AcWing】递推(就是那种很棘手的题)

🚥🚥🚥 

注意翻硬币的过程,是从前往后递推

就是先变第1个,然后第2个,第3个,第4个……

🚥🚥🚥 

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

int n;
string str;

void update(char& c)//引用
{
    if (c == 'W') c = 'B';//更换颜色
    else c = 'W';
}

bool check(char c)
{
    vector<int> res;
    string s = str;
    for (int i = 0; i + 1 < n; i ++ )
    {
        if (s[i] != c)
        {
            update(s[i]);
            update(s[i + 1]);
            res.push_back(i);//存下这个操作,因为下面要输出
        }
    }
       

    if (s.back() != c) return false;//就是没有全部变为一个颜色

    cout << res.size() << endl;
    for (int x: res) cout << x + 1 << ' ';//因为题目中的下标从1开始
    if (res.size()) cout << endl;

    return true;
}

int main()
{
    int T;
    cin >> T;
    while (T -- )
    {
        cin >> n >> str;
        if (!check('B') && !check('W')) puts("-1");
        //判断能不能全部变为一个颜色
        //注意,check的返回类型为bool类型
    }

    return 0;
}

P1146 硬币翻转 – 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

【AcWing】递推(就是那种很棘手的题) 翻n-1枚硬币,就是有一枚不翻,也可以理解为翻一枚

那么把所有的硬币都翻过来,操作次数=硬币个数

🚥🚥🚥 

但是可不能这样子写,因为要输出具体的操作方法 

【AcWing】递推(就是那种很棘手的题)

 代码

#include<iostream>
using namespace std;
const int maxn=101;
bool a[maxn];//a数组负责存储硬币的状态
int n;//n枚硬币
int main()
{
    cin>>n;
    cout<<n<<endl;//因为相当于只翻一枚,所以翻n次即可

    for(int i=1;i<=n;i++){//i表示这是第几次翻
        for(int j=1;j<=n;j++){//表示当前翻得是第几枚硬币
            if(j!=i){//如果不为第i枚(因为翻的是n-1枚)
                if(a[j])a[j]=0;//1变成0
                else a[j]=1;//0变成1
            }
            cout<<a[j];//输出当前状态
        }
        cout<<endl;//别忘了换行
    }
    return 0;
}

Code over!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131376.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!