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

相关文章
|
监控 架构师 前端开发
软件研发管理制度
软件研发管理制度
3804 1
|
9月前
|
设计模式 算法 Java
设计模式篇
设计模式篇
224 0
|
存储 边缘计算 安全
阿里云全球基础设施展示,公共云地域、边缘节点、超级数据中心分布图
本文为大家介绍了阿里云在2024年的全球基础设施布局,包括公共云地域、边缘节点、超级数据中心等各个阶段和方面。阿里云基础设施已覆盖全球四大洲,拥有30个公共云地域和89个可用区,以及超过3200个边缘节点,为其用户提供了广泛且深入的服务覆盖。
阿里云全球基础设施展示,公共云地域、边缘节点、超级数据中心分布图
|
消息中间件 存储 负载均衡
中间件注册与订阅
【7月更文挑战第1天】
350 2
|
Java 编译器
java变量
java变量
189 1
|
弹性计算 Linux 数据安全/隐私保护
biubiu~3分钟搭建幻兽帕鲁个人本地服务器,多人联机游戏
biubiu~3分钟搭建幻兽帕鲁个人本地服务器,多人联机游戏
243 0
|
消息中间件 缓存 算法
我在项目里用雪花算法搞了唯一ID生成,结果上线就引发了故障...
我在项目里用雪花算法搞了唯一ID生成,结果上线就引发了故障...
|
机器人
不同路径
不同路径
205 0