Codeforces Round #643 (Div. 2)

Posted likunhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #643 (Div. 2)相关的知识,希望对你有一定的参考价值。

题目传送门

A. Sequence with Digits

an+1=an+minDigit(an)maxDigit(an),已知a1,k,求ak。

当minDigit(an)=0时,an+1=an,对后续的答案不会产生影响了。

技术图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, a, b) for (register int i = a; i <= b; i++)

ll a, k;

void solve()
{
    cin >> a >> k;
    while (--k)
    {
        ll x = 9, y = 0;
        for (ll tmp = a; tmp; tmp /= 10)
        {
            x = min(x, tmp % 10);
            y = max(y, tmp % 10);
        }
        if (x == 0)
            break;
        a += x * y;
    }
    cout << a << endl;
}

int main()
{
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
}
View Code

 

B. Young Explorers

第i个人能存在于人数大于等于ei的队伍,求最大队伍数。

贪心,将e数组排个序,从小到大进行分组。

技术图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, a, b) for (register int i = a; i <= b; i++)

ll n, e[200010];

void solve()
{
    cin >> n;
    rep(i, 1, n) cin >> e[i];
    sort(e + 1, e + n + 1);
    int tmp = 0, ans = 0;
    rep(i, 1, n)
    {
        tmp++;
        if (tmp >= e[i])
        {
            ans++;
            tmp = 0;
        }
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
}
View Code

 

C. Count Triangles

a<=x<=b<=y<=c<=z<=d,x,y,z能构成三角形的个数。

首先,暴力

rep(x, a, b) rep(y, b, c) rep(z, c, d) if (x + y > z) ans++;

优化至二维,x+y>d时,y就没有必要再往大遍历

rep(x, a, b) rep(y, b, c)
{
    if (x + y > d)
    {
        ans += (c - y + 1) * (d - c + 1);
        break;
    }
    if (x + y > c)
        ans += x + y - c;
}

再往下我就不会了。。( ´? ??`)

 

D. Game With Array

构造一个元素和为s,长度为n的数组,以及k,使非空子数组的和不为s-k和k。

类似1,1,1,,,1,s-n+1构造,如果s-n+1>2,前n-1项和一定不为n。然后就判断下(s-n+1)是否大于n。(特判一下n==1,s==2)

技术图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, a, b) for (register int i = a; i <= b; i++)
 
ll n, s;
void solve()
{
    cin >> n >> s;
    if (n == 1 && s == 2)
        puts("YES
2
1");
    else if (s - n <= 1 || s + 1 <= 2 * n)
        puts("NO");
    else
    {
        puts("YES");
        rep(i, 1, n - 1) cout << "1 ";
        cout << s - n + 1 << endl
             << n;
    }
}
 
int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
}
View Code

 

以上是关于Codeforces Round #643 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #643 (Div. 2) 题解

Codeforces Round #643 (Div. 2) D. Game With Array(构造)

Codeforces Round #643 (Div. 2) D. Game With Array(构造)

Codeforces Round #643 (Div. 2) 题解 (ABCD)(佛系更新中)

Codeforces Round #643 (Div.2)

Codeforces Round #643 (Div.2)