前三题还是比较水的。除了C题受制于英文理解成了正负交替子序列和最大值当成了条dp,也都没浪费什么时间
A. Candies
数学题
$$x=\frac{n}{2^k-1}$$
/* * @Author: Gehrychiang * @LastEditTime: 2020-04-22 22:11:28 * @Website: www.yilantingfeng.site * @E-mail: gehrychiang@aliyun.com * @ProbTitle: */ //#pragma GCC optimize(2) #include <bits/stdc++.h> using namespace std; typedef long long ll; //(2^k-1)=n; int main() { //freopen("","r",stdin); //freopen("","w",stdout); int t; cin >> t; while (t--) { ll n; cin >> n; ll p = 2; while (n % ((1 << p) - 1) != 0) { ++p; } cout << n / ((1 << p) - 1) << endl; } return 0; }
B. Balanced Array
也算个数学题,显然可以推出来n只有是4的倍数的时候才可以,在奇数最后一个补上前面奇数拉下的差值即可
/* * @Author: Gehrychiang * @LastEditTime: 2020-04-22 22:12:41 * @Website: www.yilantingfeng.site * @E-mail: gehrychiang@aliyun.com * @ProbTitle: */ //#pragma GCC optimize(2) #include <bits/stdc++.h> using namespace std; typedef long long ll; //n%4==0 int main() { //freopen("","r",stdin); //freopen("","w",stdout); int t; cin >> t; while (t--) { int n; cin >> n; if (n % 4 != 0) { 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 - 1; i++) { cout << i * 2 - 1 << " "; } cout << n - 1 + n / 2 << endl; } } return 0; }
C. Alternating Subsequence
因为是要找最长的里面的最大值(注意先要保证最长)也就是说每一次遇到正负交替的时候一定要进行更新,而当符号相同时更新大值即可。小贪心
/* * @Author: Gehrychiang * @LastEditTime: 2020-04-22 22:14:07 * @Website: www.yilantingfeng.site * @E-mail: gehrychiang@aliyun.com * @ProbTitle: */ //#pragma GCC optimize(2) #include <bits/stdc++.h> using namespace std; typedef long long ll; ll a[200005]; int main() { //freopen("","r",stdin); //freopen("","w",stdout); int t; cin >> t; while (t--) { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } ll cursum = a[0]; ll flag = a[0]; //保存上一个 for (int i = 1; i < n; i++) { if (a[i] > 0) { if (flag < 0) //上一个为负 本次读+ { cursum += a[i]; flag = a[i]; } else if (flag > 0 && a[i] > flag) //上一个为+ 本次读- { cursum += (a[i] - flag); flag = a[i]; } } else if (a[i] < 0) { if (flag > 0) //上一个为+ 本次读- { cursum += a[i]; flag = a[i]; } else if (flag < 0 && a[i] > flag) //上一个为-本次读+ 更新更大的 { cursum += (a[i] - flag); flag = a[i]; } } } cout << cursum << endl; } return 0; }