AcWing——第69场周赛

4615. 相遇问题 – AcWing题库

问题解析

当两者的距离能被他们的速度之和整除时他们才能见到互相。

AC代码

void solve()
{
    int n, m, a, b;
    cin >> n >> m >> a>> b;
    int x = m - n, y = a + b;
    if (x % y == 0)cout << x / y << endl;
    else cout << -1 << endl;
}

4616. 击中战舰 – AcWing题库

问题解析

咱们已经知道,一个战舰会占有b个方位,咱们攻击这b个格子中任意一个格子都可以击中战舰。

那么咱们每连续b个格子就记载其中的一个坐标就行(我这儿把坐标直接存入vector中),最终记载下来的v.size()个坐标中,藏有a个战舰。

咱们要击中至少一个,那么假定前v.size()-a发都没中,那第v.size()-a+1发必定就会打中一发,所以答案就是v.size()-a+1,把咱们记载的坐标随便输出v.size()-a+1个就行

AC代码

void solve() {
    int n, a, b, k, cnt = 0;
    string s;
    cin >> n >> a >> b >> k >> s;
    vector<int>v;
    for (int i = 0; i < n; i++)
    {
        if (s[i] == '0')
        {
            cnt++;
            if (cnt == b)
            {
                v.push_back(i + 1);
                cnt = 0;
            }
        }
        else cnt = 0;
    }
    cout << v.size() - a + 1 << endl;
    for (int i = 0; i < v.size() - a + 1; i++)cout << v[i] << " ";
}

4617. 解方程 – AcWing题库

问题解析

原方程:a-(a^x)-x=0,转化一下就可变成a-x=a^x

即两个数的异或成果等于他们相减,那么咱们就可以依据异或运算的性质来推断一下:

  1. 当a的二进制下第i位是0时,x的二进制第i位如果是1,那异或运算后成果显然会变大,所以只能是0。
  2. 当a的二进制下第i位是1时,x的二进制可所以1或者0:如果是1,异或后相当于进行减法运算;如果是0,异或后相当于没减掉。

那么:a的二进制下为0的方位,x二进制下也是0;a二进制下为1的方位,x的二进制下可认为1或0。

成果就有:2^(a二进制下1的个数)

AC代码

void solve()
{
    int n, cnt = 1;
    cin >> n;
    while (n)
    {
        if (n % 2 == 1)
            cnt *= 2;
        n /= 2;
    }
    cout << cnt << endl;
}