【Atcode题解】AtCoder Beginner Contest 197

这篇博客介绍了三个C++编程问题的解决方案:A部分展示了如何旋转字符串,B部分涉及计算给定起点的视野范围,C部分探讨了如何通过异或运算找到序列操作的最小结果。通过示例代码详细解释了实现过程,适合C++初学者和进阶者学习。
摘要由CSDN通过智能技术生成

A - Rotate

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
 
int main()
{
    string s;
    cin >> s;
    cout << s[1] << s[2] << s[0];
    return 0;
}

B - Visibility

上下左右四个循环跑一遍。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
 
char maze[120][120];
 
int main()
{
    int h, w, x, y;
    cin >> h >> w >> x >> y;
    for (int i = 1; i <= h; i++)
        for (int j = 1; j <= w; j++)
            cin >> maze[i][j];
    int ans = 0;
    for (int i = x + 1; i <= h; i++)
    {
        if (maze[i][y] == '#')
            break;
        ans++;
        //cout << ans << endl;
    }
 
    for (int i = x - 1; i >= 1; i--)
    {
        if (maze[i][y] == '#')
            break;
        ans++;
    }
 
    for (int i = y + 1; i <= w; i++)
    {
 
        if (maze[x][i] == '#')
            break;
        //cout << x << " " << i << endl;
        ans++;
        //cout << ans << endl;
    }
 
    for (int i = y - 1; i >= 1; i--)
    {
        if (maze[x][i] == '#')
            break;
 
        ans++;
        //cout << ans << endl;
    }
    cout << ans + 1 << endl;
 
   // system("pause");
}

C - ORXOR

给定一个长度为n的序列,将序列分成若干个区间,将各个区间内的元素或运算后得到的结果进行异或运算, 求最终结果的最小值


对于长度为n的序列,一共进行n-1次操作,枚举所有可能的操作序列 ,比较得到最小值。

枚举操作序列

用二进制法枚举所有可能的序列,设1为 xor 操作,0为 or 操作
对于一个长度为n的二进制序列,其最大值为1<<n;
枚举从0-1<<n 的所有值,将每个值对应的二进制数序列作为可能的操作序列。

int solve(int x)
{
    memset(a, 0, sizeof(a));
    for (int i = 0; i < n; i++)
        if (x & (1 << i))
            a[i + 1] = 1;

    return query(a);
} 

int main()
{

    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> q[i];
    int minx =0x7fffffff;
    for (int i = 0; i < (1 << n); i++)
    {
        minx = min(solve(i), minx);
    }
    cout << minx;
    system("pause");
}

对每个操作序列求值

在这里插入图片描述

栈。

int query(int a[])
{
    stack<int> sk;
    sk.push(q[0]);
    for (int i = 1; i < n; i++)
    {
        if (a[i] == 0)
        {
            int tmp = sk.top();
            sk.pop();
            sk.push(tmp | q[i]);
        }
        else
            sk.push(q[i]);
    }

    int ans = sk.top();
    sk.pop();
    while (!sk.empty())
    {
        int tmp = sk.top();
        sk.pop();
        ans = ans ^ tmp;
    }
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值