2024.11.29 周五
2024.11.29 周五
-
Q1. 1200
给定黑白保龄球a,b个,设合法摆放为:金字塔形状,每层个数1,2,3...,且每层颜色相同。问最多可合法摆放层数的数量。 -
Q2. 1400
三种特定的木头长度18,21,25,一根长度为60的木头可以截成多段。分别需要n根长度为18,21,25的木头,问最少需要多少长度为60的木头。 -
Q3. 1600
给定一个数n和初始大小n*n空矩阵,构造n个点,使所有点对的曼哈顿距离的种类数最多。 -
A1. 18mins
(猜测)答案为最大的n满足n*(n+1)/2<=s。 -
A2. 14mins-16mins
发现长60的木头最多贡献2/3根木头,贪心3根:18,18,21 / 18,21,21。 -
A3. 35mins
观察样例发现0~2n-2都能被构造出(如果没有样例只能自己去想),即能被构造出答案的上界。
这就要求了除了第一个点,每个点都要有2个贡献。
考虑一种特殊的图样(如下图),利用1,2行及对角线即可构造出一种3,4,5,6...2n-3,2n-2.的距离。
x.....
x.....
..x...
...x..
....x.
.....x
A1.
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' //
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
const int mod = 998244353;
const int N = 10 + 5e5;
void _();
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t;
while (t--)
_();
return 0;
}
// 给定黑白保龄球a,b个,设合法摆放为:金字塔形状,每层个数1,2,3...,且每层颜色相同。问最多可合法摆放层数的数量。
// 18mins
// (猜测)答案为最大的n满足n*(n+1)/2<=s。
void _()
{
int a, b;
cin >> a >> b;
int s = a + b;
int l = -1, r = 1e9;
while (r - l - 1)
{
int mid = l + r >> 1;
if (mid * (mid + 1) <= s << 1)
l = mid;
else
r = mid;
}
cout << l << endl;
}
A2.
#include <bits/stdc++.h>
// #define int long long //
#define endl '\n' // 交互/调试 关
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
// cin >> T;
while (T--)
_();
return 0;
}
// 三种特定的木头长度18,21,25,一根长度为60的木头可以截成多段。分别需要n根长度为18,21,25的木头,问最少需要多少长度为60的木头。
// 14mins-16mins
// 发现长60的木头最多贡献2/3根木头,贪心3根:18,18,21 / 18,21,21。
void _()
{
int n;
cin >> n;
int res = n / 3 * 2;
if (n % 3)
{
res++;
if (n % 3 == 2)
n++;
}
res += n + 1 >> 1;
cout << res << endl;
}
A3.
#include <bits/stdc++.h>
#define int long long //
#define endl '\n' // 交互/调试 关
using namespace std;
#define bug(BUG) cout << "bug:# " << (BUG) << endl
#define bug2(BUG1, BUG2) cout << "bug:# " << (BUG1) << " " << (BUG2) << endl
#define bug3(BUG1, BUG2, BUG3) cout << "bug:# " << (BUG1) << ' ' << (BUG2) << ' ' << (BUG3) << endl
void _();
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while (T--)
_();
return 0;
}
// 1600分
// 给定一个数n和初始大小n*n空矩阵,构造n个点,使所有点对的曼哈顿距离的种类数最多。
// 35mins
// 观察样例发现0~2n-2都能被构造出(如果没有样例只能自己去想),即能被构造出答案的上界。
// 这就要求了除了第一个点,每个点都要有2个贡献。
// 考虑一种特殊的图样(如下图),利用1,2行及对角线即可构造出一种3,4,5,6...2n-3,2n-2.的距离。
// x.....
// x.....
// ..x...
// ...x..
// ....x.
// .....x
void _()
{
int n;
cin >> n;
auto print = [](int x, int y)
{
cout << x << ' ' << y << endl;
};
print(1, 1);
print(2, 1);
for (int i = 3; i <= n; i++)
print(i, i);
cout << endl;
}