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 0 和 1 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 d1,d2 互质,那么 d 1 + d 2 , d 1 ∗ d 2 d_1+d_2,d_1*d_2 d1+d2,d1∗d2 互质。只要找到 d 1 ∗ d 2 = a d_1*d_2=a d1∗d2=a 且 d 1 , d 2 d_1,d_2 d1,d2 互质的两个数 d 1 , d 2 d_1,d_2 d1,d2。
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;
}