CF1584 总结
A Mathematical Addition
给出 \(u,v\) , 求方程\(\frac{x}{u}+\frac{y}{v}=\frac{x+y}{u+v}\)的一组整数解.
暴力合并分数可得:
\[xv^2+yu^2=0
\]
显然\(x=u^2,y=-v^2\)即可.注意防止爆int.
#include <iostream>
#include <cstdio>
using namespace std;
int T;
long long a, b, x, y;
int main()
{
ios::sync_with_stdio(false);
cin >> T;
while (T--)
{
cin >> a >> b;
x = a * a, y = b * b;
cout << x << " " << -y << endl;
}
}
B Coloring Rectangles
给出一个\(n \times m\)的矩形.初始全是红色,将其任意横竖划分成小矩形(不能是\(1\times 1\)),再将一些色块染成蓝色,使没有一个矩形里相邻块颜色相同.
由于任意划分,不妨尽量划分成\(1\times3\) 的块,保证一个蓝块覆盖两个红块.
注意竖直划分完之后还可以水平划分.
写的还是比较简洁的.
#include <iostream>
#include <cstdio>
using namespace std;
long long T, n, m;
long long solve(long long r, long long c)
{
if (r == 1)
{
if (c % 3 == 0)
return c / 3;
else
return c / 3 + 1;
}
if (r == 2 && c == 2)
return 2;
if (r % 3 == 0)
return c * (r / 3);
else
return c * (r / 3) + solve(c, r % 3);
}
int main()
{
ios::sync_with_stdio(false);
cin >> T;
while (T--)
{
cin >> n >> m;
cout << min(solve(m, n), solve(n, m)) << endl;
}
}
C Two Arrays
给两个序列a,b,问能否通过一次如下操作把a变成b:
使a中任意个数+1,然后随意改变a的顺序.
想复杂了,以为是二分图,画了几个样例发现很符合,但估计过不去.
yyq云:排序
然后就没有然后了.
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 105;
int T, n;
int a[N], b[N];
int main()
{
ios::sync_with_stdio(false);
cin >> T;
while (T--)
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
cin >> b[i];
sort(a + 1, a + 1 + n);
sort(b + 1, b + 1 + n);
bool flag = true;
for (int i = 1; i <= n; i++)
if (a[i] != b[i] && a[i] + 1 != b[i])
{
cout << "NO" << endl;
flag = false;
break;
}
if (flag)
cout << "YES" << endl;
}
}
D Guess the Permutation
长度为n的序列\(a\)一开始满足\(a_i=i\),经过下面一次操作:
选择\(i,j,k\),将\([i,j-1]\)取反,\([j,k]\)取反.
每次可以向交互库询问区间逆序对数,最多询问40次.(\(n\leq 10^9\))
考场上英语不好,读了半天读不下去了,去做E,发现不可做,就弃赛了.
总结
这次比赛ABC均为结论题(感觉后面也有点像,但我不会),其中B题较有新意.A,C应该属于送分题难度,但是C却想复杂了,最后开题顺序问题导致只做了三个题.排了rk2000/10000
,不太理想.以后要对一些奇怪的结论敢于尝试,快速写出代码或者快速hack掉,不能在证明上浪费太多时间.另外要把握题目难度,防止误判.
本文来自博客园,作者:Kinuhata,转载请注明原文链接:https://www.cnblogs.com/KinuhataSaiai/p/15552949.html