(0条未读通知) 牛客练习赛116_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)
A.等差数列
对于此题可以分为两类:
1.当k == 0,此时A1,A2...值都为a
2.当k != 0,此时又分为两大类:
1.平局(发现A1,A2,A3等连续的数都是奇偶数交替变化的,如果区间内的数可以整除2说明奇偶数相同)
2.分出奇偶(上方的情况已近判断出奇偶数的个数不相同,故现在我们只需要判断出区间内第一个数是奇数还是偶数,是奇数就说明奇数多,是偶数则说明偶数多eg.123, 234
数字过大,开始时可以%2
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a, k, q, l, r;
int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> a >> k >> q;a %= 2;k %= 2;while(q --){cin >> l >> r;if(k == 0){if(a % 2)cout << 1 << '\n';else cout << -1 << '\n'; } else{if((r - l + 1) % 2 == 0)cout << 0 << '\n';else{if((a + (l - 1) * k) % 2)cout << 1 << '\n';else cout << -1 << '\n';}}}return 0;
}
B. 挖坑
最小步数如果要有所变化,不可以只单向的加障碍物,需要双向来加,因为它可以从左下角走到终点,也可以从右上角走到终点,所以障碍物必须上下双向开始相加
由此进行规律找寻,一列最多有两个障碍物,如果双向都是两个障碍物就会多走4步,如果一向一个障碍物,另一向两个障碍物会多走两步,会发现我们每次会加四个障碍物或者三个障碍物,四个障碍物会多走4步,三个障碍物会多走2步
接下来我们讨论与事实不符合输出-1的情况
1.最少步数都大于k
2.能走的最多的步数小于k
3.需要走的步数为奇数
#include<bits/stdc++.h>
using namespace std;
int q, n, k, res;
int main()
{cin >> q;while(q --){cin >> n >> k;if(n + 1 > k || (n - 1) / 4 * 4 + n + 1 < k || (k - n- 1) & 1)cout << -1 << '\n';else {int p = k - n - 1;res = p / 4;//需要几个四个障碍物res = res * 4 + ((k - n - 1 - (res * 4))/ 2) * 3;//加上需要三个障碍物的cout << res << '\n';}}return 0;}