Codeforces Round #643 (Div. 2) ABD

这套题目也太顶了,强推

A-Sequence with Digits
https://codeforces.com/contest/1355/problem/A

题目大意:
给定一个初始数值n,问我们在每次都加上这个数字的数位最大值*最小值,

an+1=an+min Digit(an)⋅max Digit(an).

在经历了k次操作之后的最终结果是什么?

【注意k==1的时候不需要对n另外操作】。
input 
8
1 4
487 1
487 2
487 3
487 4
487 5
487 6
487 7
output 
42
487
519
528
544
564
588
628

一个细节没有考虑好,纯暴力可以wa半年

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=2000020;
const int N=200200,M=2002;
int main()
{
    cin.tie(0); cout.tie(0);ios::sync_with_stdio(false);
    int T=1;
    cin>>T;
    while(T--)
    {
        LL n,k;
        cin>>n>>k;
        LL ans=n;
        for(LL i=2;i<=k;i++)
        {
            string s=to_string(ans);
            sort(s.begin(),s.end());
            if((s[0]-'0')==0) break;
            else ans+=((s[0]-'0')*(s[s.size()-1]-'0'));
        }
        cout<<ans<<endl;
    }
    return 0;
}

没想到吧,数位是0的时候就可以直接结束啦!

B-Young Explorers
https://codeforces.com/contest/1355/problem/B

题目大意:
每个人都有一个经验值a[i],每个人可以组队也可以不组队,

但前提要求是每个人要组队的话,必须要找到人数>=自己经验值的队伍

问我们能够组队的最大队伍数量是多少?
input 
2
3
1 1 1
5
2 3 1 2 2
output 
3
2

前几天刚在cf1400的题目上写了一个一摸一样的题目,照搬直接ac

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=2000020;
const int N=200200,M=2002;
LL a[N],f[N];
int main()
{
    cin.tie(0); cout.tie(0);ios::sync_with_stdio(false);
    int T=1;
    cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        for(LL i=1;i<=n;i++)
            cin>>a[i];
        sort(a+1,a+1+n);
        //for(int i=1;i<=n;i++)
        //    cout<<a[i]<<" ";
        //cout<<endl;
        LL maxn=0;
        f[0]=0;
        for(LL i=1;i<=n;i++)
        {
            f[i]=f[i-1];
            if(i>=a[i]) f[i]=max(f[i],f[i-a[i]]+1);
            //cout<<f[i]<<" ";
            maxn=max(maxn,f[i]);
        }
        //cout<<endl;
        cout<<maxn<<endl;
    }
    return 0;
}

D-Game With Array
https://codeforces.com/contest/1355/problem/D

题目大意:
给定一个数组长度n,给定一个总和m

让我们构造这样一个数组:长度为n,总和为m;并且任意子序列都凑不出S或S-k(S让我们自己找一个数)

满足这些条件的就按要求输出,不能满足的就输出-1。
inputCopy
1 4
outputCopy
YES
4
2
inputCopy
3 4
outputCopy
NO
inputCopy
3 8
outputCopy
YES
2 1 5
4

读懂题目就赢了一大半

  • 我们先特判NO的条件,发现在2的基础上,最小的数字都是2,所以直接把凑不出的数字定为1

  • 同时我们可以想到:我们在数组中填数最小都为2,所以,我们可以知道加到的n-1个的总和的最大数就是m-2,n个数字的总和就是m,所以一定达不到m-1的位置

  • 所以根据这个结论,我们直接填充n-1个2,再填一个剩余的数字就行。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=2000020;
const int N=200200,M=2002;
LL a[N];
int main()
{
    cin.tie(0); cout.tie(0);ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        LL n,m;
        cin>>n>>m;
        if(m<2*n) cout<<"NO"<<endl;
        else
        {
            cout<<"YES"<<endl;
            for(LL i=1;i<=n;i++)
            {
                if(i!=n)
                {
                    cout<<"2 ";
                    m-=2;
                }
                else cout<<m<<endl;
            }
            cout<<"1"<<endl;
        }
    }
    return 0;
}

哎,最近的判错机制总是判歪,我有点迷啊

posted @ 2022-09-30 18:00  Vijurria  阅读(17)  评论(0编辑  收藏  举报