A. Candies
题意:给定一个n,求让 x+2*x+4*x+⋯+2^k−1*x = n
等式成立的任意一个x。
题解:x = n / (1 + 2 + 4 + ⋯ + 2^k-1)
当n % (1 + 2 + 4 + ⋯ + 2^k-1) = 0
时即可。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin >> T;
for (int cas = 0; cas < T; cas++) {
int n;
cin >> n;
int res = 1, i = 2;
while (1) {
res += i;
i *= 2;
if (n % res == 0) {
cout << n / res << endl;
break;
}
}
}
return 0;
}
B. Balanced Array
题意:给定一个偶数n。问能否构造一个长度为n的数组,前n/2的元素为偶数,后n/2的元素为奇数,且前n/2的元素之和等于后n/2的元素之和。如果能则输出“YES”和构造的数组,不能则输出“NO”。
题解:如果n/2为奇数,那么前n/2个元素必为偶数,后n/2个元素必为奇数,不可能相等。如果n/2为偶数,先给前n/2个元素直接取2,4,6等等即可,后n/2-1个元素取1,3,5等。最后一个元素取两者之间的差值。
#include <bits/stdc++.h>
using namespace std;
int arr[2*100007];
int main()
{
int T;
cin >> T;
for (int cas = 0; cas < T; cas++) {
int n;
cin >> n;
if (n/2 % 2) cout << "NO" << endl;
else {
cout << "YES" << endl;
for (int i = 1; i <= n/2; i++) {
cout << i*2 << ' ';
}
for (int i = 1; i < n/2; i++) {
cout << 2*i-1 << ' ';
}
cout << n-1+n/2 << endl;
}
}
return 0;
}
C. Alternating Subsequence
题意:给定一个数组a,含有n个非0元素。求最长的正负交替的子序列的元素最大和。
题解:将数组a中的元素分到不同的区间,相同符号的元素在一个区间(如:((1 2 3 )(-1 -2))。只要从每个区间中取出最大的一个即可。
#include <bits/stdc++.h>
using namespace std;
int arr[2*100007];
int main()
{
int T;
cin >> T;
for (int cas = 0; cas < T; cas++) {
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> arr[i];
long long tmp = arr[0], ans = 0;
for (int i = 1; i < n; i++) {
if (tmp < 0 && arr[i] > 0 || tmp > 0 && arr[i] < 0) {
ans += tmp;
tmp = arr[i];
} else {
tmp = tmp < arr[i] ? arr[i] : tmp;
}
}
ans += tmp;
cout << ans << endl;
}
return 0;
}