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。
即两个数的异或成果等于他们相减,那么咱们就可以依据异或运算的性质来推断一下:
- 当a的二进制下第i位是0时,x的二进制第i位如果是1,那异或运算后成果显然会变大,所以只能是0。
- 当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;
}