abc252_a

题目翻译

给一个数字 $n$,输出 ASCLL 码里第 $n$ 位的字母。

题目思路

直接输出。

AC 代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    cout<<char(n)<<endl;
    return 0;
}

abc252_b

题目翻译

有 $n$ 个数,$a_1,a_2,a_3...a_n$,选择 $k$ 个数,分别为 $b_1,b_2,b_3...b_k$。

问 $b$ 里是否有最大数。

题目思路

先找出 $a$ 的最大值,判断是否有最大即可。

AC 代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,k,maxx=-1;
    bool f=0;
    cin>>n>>k;
    int a[n+1];
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        maxx=max(maxx,a[i]);
    }   
    for(int i=1;i<=k;i++)
    {
        int x;
        cin>>x;
        if(a[x]==maxx)f=1;
    }
    puts(f?"Yes":"No");
    return 0;
}

abc252_c

题目翻译

输入 $n$ 个 $0$ 到 $9$,$10$ 个数字构成的排列。
如果在第 $i$ 秒按下停止按钮,那么他会显示第 $i%10$ 个字符($0$秒最左的字符,$9$ 秒最右的字符)。
同一秒只能按下一个停止按钮。
目标是让这 $n$ 个排列显示相同的字母。
问最优情况下需要几秒。

题目思路

枚举最后出现哪个数字。

AC 代码

#include<bits/stdc++.h>
using namespace std;
string s[105];
int a[105][105];
int main()
{
    int n,ans=INT_MAX;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<s[i].size();j++)//0开始,错了好几次QwQ
        {
            a[s[i][j]-'0'][i]=j;//每种字符的第i的字符串所在位置。
            for(int k=1;k<i;k++)
            {
                if(a[s[i][j]-'0'][k]%10==j)
                {
                    a[s[i][j]-'0'][i]+=10;//多10秒
                }
            }
        }
    }
    for(int i=0;i<=9;i++)
    {
        int m=-1,cnt=0;
        for(int j=1;j<=n;j++)
        {
            m=max(m,a[i][j]);
        }   
        ans=min(ans,m);
    }
    cout<<ans<<endl;
    return 0;
}

abc252_d

题目翻译

有 $n$ 个数,问是否存在 $a_i\ne a_j \ne a_k$ 且 $i<j<k$。

题目思路

容斥原理,看所有排列 $-$ 三个一样 $-$ 两个一样

AC 代码

#include<bits/stdc++.h>
using namespace std;
long long s[200005];
int main()
{
    long long n;
    cin>>n;
    int a[n+1];
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        s[a[i]]++;
    }
    long long x=n*(n-1)/2*(n-2)/3;//总数
    long long y=0,z=0;
    for(int i=1;i<=200000;i++)//三个一样
    {
        long long yy=0;
        if(s[i]>=3)
        {
            yy=s[i]*(s[i]-1)/2*(s[i]-2)/3;
        }
        y+=yy;
    }
    for(int i=1;i<=200000;i++)//两个一样
    {
        long long zz=0;
        if(s[i]>=2)
        {
            zz=s[i]*(s[i]-1)/2*(n-s[i]);
        }
        z+=zz;
    }
    cout<<x-y-z<<endl;
    return 0;
}

abc252_f

题目翻译

双倍经验

题目思路

同上,不同在于,考虑有剩余的话,再请一个人来拿走剩余部分。

AC 代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    multiset<long long>s;
    long long n,l,ss=0;
    cin>>n>>l;
    for(int i=1;i<=n;i++)
    {
        long long x;
        cin>>x;
        s.insert(x);
        ss+=x;
    }
    if(l-ss!=0)s.insert(l-ss);
    long long sum=0;    
    while(s.size()>1)
    {
        long long x=*s.begin();
        s.erase(s.begin());
        long long y=*s.begin();
        s.erase(s.begin());
        s.insert(x+y);
        sum+=x+y;
    }
    cout<<sum<<endl;
    return 0;
}
最后修改:2023 年 04 月 20 日
v我50吃疯狂星期四