abc261_a

题目翻译

数轴上 $[l_1,r_1]$ 和 $[l_2,r_2]$ 重叠长度。

题目思路

注意数轴上,不是问重叠数字个数。

罚时带来的教训。

AC 代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int l1,r1,l2,r2,ans=0;
    cin>>l1>>r1>>l2>>r2;
    for(int i=l1;i<=r1;i++)
    {
        if(l2<=i&&i<=r2)ans++;
    }
    cout<<max(0,ans-1)<<endl;
    return 0;
}

abc261_b

题目翻译

有 $n$ 个人对局,生成了 $n \times n$ 大小的结果表。

$a_{i,j}$ 即为第 $i$ 人对第 $j$ 人的结果。

W 为胜利。

L 为失败。

- 为未知,任何结果都可能。

D 为平局。

问结果表是否合法。

题目思路

直接扫一遍。

AC 代码

#include<bits/stdc++.h>
using namespace std;
char a[1020][1020];
int main()
{
    int n;
    bool f=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(a[j][i]=='D'&&a[i][j]=='D'||a[j][i]=='W'&&a[i][j]=='L'||a[j][i]=='L'&&a[i][j]=='W'||a[j][i]=='-'||a[i][j]=='-')
            {

            }
            else
            {
                f=1;
            }
        }
    }
    puts(f==1?"incorrect":"correct");
    return 0;
}

abc261_c

题目翻译

新建文件或文件夹时,若名字重复,往往会命名为 新建文件夹(1) 的名字。

给出创建的文件,输出最后命名。

题目思路

map 练习题,很裸,不多说。

AC 代码

#include<bits/stdc++.h>
using namespace std;
map<string,int>m;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        string s;
        cin>>s;
        m[s]++;
        if(m[s]==1)cout<<s<<endl;
        else cout<<s<<"("<<(m[s]-1)<<")"<<endl;
    }
    return 0;
}

abc261_d

题目翻译

有 $n$ 个数 $a_1,a_2,\dots a_n$。

你可以抛 $n$ 次硬币,第 $i$ 次正面可以获得 $a_i$ 的分数,并记录连击。

连击数达到指定值时,会获得连击奖励。

题目思路

我们用 $f_{i,j}$ 表示前 $i$ 次最后连击次数。

分两种情况:

  • 延续连击:$f_{i,j}=f_{i-1,j-1}+连击奖励+分数$
  • 停止连击:$f_{i,0}=\max(f_{i,0},f_{i-1,j})$

AC 代码

#include<bits/stdc++.h>
using namespace std;
int a[5020];
int b[5020];
long long f[5020][5020];
int main()
{
    int n,m;
    long long ans=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    while(m--)
    {
        int x,y;
        cin>>x>>y;
        b[x]=y;
    }
    f[1][1]=a[1]+b[1];
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<i;j++)
        {
            f[i][j]=f[i-1][j-1]+b[j]+a[i];
            f[i][0]=max(f[i][0],f[i-1][j]);
        }
        f[i][i]=f[i-1][i-1]+a[i]+b[i];
    }
    for(int i=0;i<=n;i++)ans=max(ans,f[n][i]);
    cout<<ans<<endl;
    return 0;
}
最后修改:2023 年 04 月 20 日
v我50吃疯狂星期四