1. 程式人生 > 其它 >[codeforces] 暑期訓練之打卡題(二)

[codeforces] 暑期訓練之打卡題(二)

每個標題都做了題目原網址的超連結


Day11《Given Length and Sum of Digits...

題意:

給定一個數 m 和 一個長度 s,計算最大和最小在 s 長度下,各位數字之和為 m 的值

如果無法生成,則輸出兩個-1

題解:

需要注意:在輸出最大值時,判一下 k 是否為 0

上板子:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int len, sum; cin >> len >> sum;
    if (sum == 0
&& len != 1 || sum > len * 9) cout << -1 << ' ' << -1 << endl; else { for (int i = len - 1, k = sum; i >= 0; --i) { int x = max(0, k - 9 * i); if (!x && i == len - 1 && k)x = 1; cout
<< x; k -= x; } cout << ' '; for (int i = len - 1, k = sum; i >= 0; --i) { int x = min(9, k); cout << x; k -= x; } } return 0; }

Day12《Cheap Travel

題意:

一個 ride 需要 a 盧布,m 個 ride 需要 b 盧布,這兩種方案都可以無限制地採用,要完成 n rides 最少需要多少盧布

注:由樣例可知,不一定要剛好完成 n rides,可以完成 cnt rides(cnt > n)

題解:

本題我採用的分類討論:

  1. 當 n <= m 時,一張多程票 b 就可以完成 n rides,故需要比較 a*n 和 b 的大小
  2. 當 n > m 時,比較 a 和 b/m 的價格(b/m 即為 m rides 中的單程價)

上板子:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int n, m;
    double a, b;
    while (scanf("%d%d%lf%lf", &n, &m, &a, &b) != EOF)
    {
        int ans;
        if (n <= m) ans = (a * n > b ? b : a * n);
        else if (a >= b / m)//單程a的價格比買多程b的平均單程價格b/m高
        {
            ans = n / m * b;//儘可能購買b
            ans += min(n % m * a, b);
        }
        else ans = n * a;
        printf("%d\n", ans);
    }
    return 0;
}

Day13《BerSU Ball

題意:

給出兩個陣列,兩個元素的差小於等於 1 時才能配對,問兩組之間進行配對,求最多對數。

題解:

暴力出奇跡

上板子:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    vector<int>g;
    vector<int>b;
    int n, m, i, c, j, k = 0, num = 0;
    cin >> n;
    for (i = 0;i < n;i++)
    {
        cin >> c;
        b.push_back(c);
    }
    cin >> m;
    for (i = 0;i < m;i++)
    {
        cin >> c;
        g.push_back(c);
    }
    sort(g.begin(), g.end());
    sort(b.begin(), b.end());
    for (i = 0;i < n;i++)
    {
        for (j = k;j < m;j++)
        {
            if (abs(b.at(i) - g.at(j)) <= 1)
            {
                num++;
                k = j + 1;
                break;
            }
        }
    }
    cout << num << '\n';
    return 0;
}

Day14《BerSU Ball