Educational Codeforces Round 89 (Div. 2)

A. Shovels and Swords

讨论一下大小。

AC代码:

int n, m, k;
 
int main()
{
	int t;
	sd(t);
	while (t--)
	{
		sdd(n, m);
		int ans = 0;
		if (n > m)
			swap(n, m);
		if (2 * n <= m)
			ans = n;
		else
		{
			k = m - n;
			ans += k;
			m -= 2 * k;
			n -= k;
			ans += 2 * (n / 3);
			n %= 3;
			if (n == 2)
				ans += 1;
		}
		pd(ans);
	}
	return 0;
}

B. Shuffle

找可以覆盖的区间大小。

AC代码:

int n, m, k, x;
int l, r;
int main()
{
	int t;
	sd(t);
	while (t--)
	{
		sddd(n, x, m);
		int a = x, b = x;
		rep(i, 1, m)
		{
			sdd(l, r);
			if (l <= a && b <= r)
				a = l, b = r;
			else if (l <= a && a <= r)
				a = l;
			else if (b <= r && b >= l)
				b = r;
		}
		int ans = b - a + 1;
		pd(ans);
	}
	return 0;
}

C. Palindromic Paths

统计每个条路径每个位置的 0 0 1 1 的个数,然后找到变化最小的。

AC代码:

const int N = 5e2 + 50;
int n, m, k, x;
map<int, int> mp[N];
int main()
{
	int t;
	sd(t);
	while (t--)
	{
		sdd(n, m);
		rep(i, 1, n + m)
		{
			mp[i].clear();
		}
		rep(i, 1, n)
		{
			rep(j, 1, m)
			{
				sd(x);
				if ((n + m) % 2 == 0 && i + j == (n + m + 2) / 2)
					continue;							//路程中间位置
				mp[min(i + j, n + m + 2 - i - j)][x]++; //第几步
			}
		}
		int ans = 0;
		rep(i, 1, n + m)
		{
			int maxn = 0, sum = 0;
			for (auto j : mp[i])
				maxn = max(maxn, j.se), sum += j.se;
			ans += sum - maxn;
		}
		pd(ans);
	}
	return 0;
}

D. Two Divisors

如果 d 1 , d 2 d_1,d_2 互质,那么 d 1 + d 2 , d 1 d 2 d_1+d_2,d_1*d_2 互质。只要找到 d 1 d 2 = a d_1*d_2=a d 1 , d 2 d_1,d_2 互质的两个数 d 1 , d 2 d_1,d_2

AC代码:

const int N = 1e7 + 50;
int n, m, k, x;
int a[N], rec[N];
bool vis[N];
vector<PII> ans;
void get_prime(int n)
{
	int cnt = 0;
	vis[1] = 1;
	rep(i, 2, n)
	{
		if (!vis[i])
			a[cnt++] = i, rec[i] = i;
		rep(j, 0, cnt)
		{
			if (i * a[j] > n)
				break;
			vis[i * a[j]] = 1;
			rec[i * a[j]] = a[j];
			if (i % a[j] == 0)
				break;
		}
	}
}

int main()
{
	int t;
	get_prime(N - 10);
	sd(n);
	rep(i, 1, n)
	{
		sd(x);
		int p = rec[x], y = 1;
		if (p > 1)
			while (x % p == 0)
				x /= p, y *= p;
		if (x > 1 && y > 1)
			ans.pb({x, y});
		else
			ans.pb({-1, -1});
	}
	for (auto i : ans)
		printf("%d ", i.fi);
	printf("\n");
	for (auto i : ans)
		printf("%d ", i.se);
	printf("\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43627087/article/details/106710496
今日推荐