Atcoder KEYENCE Programming Contest 2021

比赛链接

A

题意:给你两个数组 分别为A,B

现在组合成为一个C数组,ci的值为Ai*Bj的最大值其中0<i<=j<=n

解析:预处理出每个j对应的最大A[i],并且保存C[i-1]的值,

c[i]的值等于c[i-1],b[i]*sum[i];

AC代码:

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=2e5+10;
ll a[N];
ll b[N];
ll max1[N];
int main()
{
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
        if(max1[i-1]>a[i])
        {
            max1[i]=max1[i-1];
        }
        else
        {
            max1[i]=a[i];
        }
    }
    for(int i=1; i<=n; i++)
    {
        cin>>b[i];
    }
    ll ans=0;
    for(int i=1; i<=n; i++)
    {
        ll k=max(ans,b[i]*max1[i]);
        ans=k;
        cout<<k<<endl;
    }
    return 0;
}

 B

 题意:有N个数字,K个盒子,每个盒子中不存在的最小的非负数即为次盒子的值,求所以盒子的最大值

解析:用桶存储数字的个数,从前往后进行枚举,并且进行相加。具体实现请看代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=4e5+10;
int a[N];
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=0; i<n; i++)
    {
        int q;
        cin>>q;
        a[q]++;
    }
    int sum=0;
    for(int i=0; i<n; i++)
    {
        if(a[i])
        {
            if(a[i]<k)
            {
                sum+=i*(k-a[i]);
                k=a[i];
            }
        }
        else
        {
            sum+=i*(k-a[i]);
            k=a[i];
            break;
        }
    }
    cout<<sum<<endl;
    return 0;
}

C

题意 一个H*W的矩阵中有K个格子上写了字母R,D,X

R只能移动至(i,j+1)的格子中,D只能移动至(i+1,j)的格子中,x则都可以

空白格子可以写任意的一个字母,问到(H,W)有多少种路径。

解析:偷个懒,下次写~~~

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
const int N=5010;
char mp[N][N];
ll dp[N][N];
long long int pows(long long int a, long long int k)
{
    long long int ans = 1;
    a %= mod;
    while(k)
    {
        if(k % 2)
            ans *= a;
        a = (a * a) % mod;
        k /= 2;
        ans %= mod;
    }
    return ans;
}
int main()
{
    ll h,w,k;
    cin>>h>>w>>k;
    ll t=k;
    while(t--)
    {
        int x,y;
        char c;
        cin>>x>>y>>c;
        mp[x][y]=c;
    }

    ll ans=pows(3,h*w-k);
    dp[1][1]=ans;
     ans=pows(3,mod-2);
    for(int i=1; i<=h; i++)
    {
        for(int j=1; j<=w; j++)
        {

            if(mp[i][j]=='R')
            {
                dp[i][j+1]=(dp[i][j+1]+dp[i][j])%mod;
            }
            else if(mp[i][j]=='D')
            {

                dp[i+1][j]=(dp[i+1][j]+dp[i][j])%mod;
            }
            else if(mp[i][j]=='X')
            {
                dp[i][j+1]=(dp[i][j+1]+dp[i][j])%mod;
                dp[i+1][j]=(dp[i+1][j]+dp[i][j])%mod;

            }
            else
            {
                dp[i][j+1]=(dp[i][j+1]+dp[i][j]*ans%mod)%mod;
                dp[i][j+1]=(dp[i][j+1]+dp[i][j]*ans%mod)%mod;
                dp[i+1][j]=(dp[i+1][j]+dp[i][j]*ans%mod)%mod;
                dp[i+1][j]=(dp[i+1][j]+dp[i][j]*ans%mod)%mod;
            }
        }

    }
    cout<<dp[h][w]<<endl;
    return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值