当两者的距离能被他们的速度之和整除时他们才能见到彼此。
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;
}
我们已经知道,一个战舰会占据b个位置,我们攻击这b个格子中任意一个格子都可以击中战舰。
那么我们每连续b个格子就记录其中的一个坐标就行(我这里把坐标直接存入vector中),最后记录下来的v.size()个坐标中,藏有a个战舰。
我们要击中至少一个,那么假设前v.size()-a发都没中,那第v.size()-a+1发肯定就会打中一发,所以答案就是v.size()-a+1,把我们记录的坐标随便输出v.size()-a+1个就行
void solve() {
int n, a, b, k, cnt = 0;
string s;
cin >> n >> a >> b >> k >> s;
vectorv;
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] << " ";
}
原方程:a-(ax)-x=0**,转化一下就可变成**a-x=ax。
即两个数的异或结果等于他们相减,那么我们就可以根据异或运算的性质来推断一下:
那么:a的二进制下为0的位置,x二进制下也是0;a二进制下为1的位置,x的二进制下可以为1或0。
结果就有:2^(a二进制下1的个数)。
void solve()
{
int n, cnt = 1;
cin >> n;
while (n)
{
if (n % 2 == 1)
cnt *= 2;
n /= 2;
}
cout << cnt << endl;
}