牛客练习赛116

(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
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. 挖坑

最小步数如果要有所变化,不可以只单向的加障碍物,需要双向来加,因为它可以从左下角走到终点,也可以从右上角走到终点,所以障碍物必须上下双向开始相加

牛客练习赛116_第1张图片

由此进行规律找寻,一列最多有两个障碍物,如果双向都是两个障碍物就会多走4步,如果一向一个障碍物,另一向两个障碍物会多走两步,会发现我们每次会加四个障碍物或者三个障碍物,四个障碍物会多走4步,三个障碍物会多走2步

接下来我们讨论与事实不符合输出-1的情况

1.最少步数都大于k

2.能走的最多的步数小于k

3.需要走的步数为奇数

#include
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;
 } 

你可能感兴趣的:(算法)