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;
}
posted @ 2024-11-29 12:26  move_quiet  阅读(1)  评论(0编辑  收藏  举报