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

简介: 1208. 翻硬币 - AcWing题库

1208. 翻硬币 - AcWing题库

7.1.png

#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的题(不要问我为什么)

7.2.png

🚥🚥🚥

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

就是先变第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)

7.3.png

翻n-1枚硬币,就是有一枚不翻,也可以理解为翻一枚

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

🚥🚥🚥

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

image.png

代码

#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!

相关文章
宝藏例题(欧几里得算法+素数的三种境界………)
宝藏例题(欧几里得算法+素数的三种境界………)
宝藏例题(欧几里得算法+素数的三种境界………)
|
7月前
|
算法 C++
一题带你写出图论算法模板!!!
一题带你写出图论算法模板!!!
|
7月前
|
人工智能 算法 索引
六六力扣刷题贪心算法之K次取反后最大化的数组和
六六力扣刷题贪心算法之K次取反后最大化的数组和
50 0
|
7月前
|
机器学习/深度学习
蓝桥杯-2/14天-完全平方数【另类思路】
蓝桥杯-2/14天-完全平方数【另类思路】
|
7月前
|
算法
【算法学习】—n皇后问题(回溯法)
【算法学习】—n皇后问题(回溯法)
【动态规划入门】动态规划思路五部曲_斐波那契_爬楼梯_最小花费爬楼梯
【动态规划入门】动态规划思路五部曲_斐波那契_爬楼梯_最小花费爬楼梯
73 0
|
算法
[蓝桥杯] 递归与递推习题训练
蓝桥杯比赛只有四十天左右啦,最近会按照模块更新一些有关蓝桥杯算法题。学习算法不仅仅是为了参见比赛,更是以后找工作的一个敲门砖。废话不多说,我们直接看题。
80 0
每日刷题|回溯法解决组合问题
每日刷题|回溯法解决组合问题
|
机器学习/深度学习 算法
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
68 0
|
算法 索引
从三道经典的leetcode题掌握二分法
前言 二分法是典型的搜索算法,其主要运用于有序序列中寻找目标值。其思路非常简单,就是不断比较搜索区间的中间值与目标值,当中间值等于目标值则结束搜索,如果中间值大于目标值,则继续搜索左半区间,反之搜索右半区间。 总结下,二分法就是在搜索过程中不断地将搜索区间减半,直到搜索到目标值或者搜索区间为空集。