10月4日训练总结

A:

题意:输入A,B,C,请输出A-B之间C的倍数(任意一个)

代码如下

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int main(void)
{
    ll a,b,c;
    cin>>a>>b>>c;
    ll k=c;
    for(k;k<=b;k+=c)
    {
        if(a<=k&&k<=b)
        {
            cout<<k<<endl;
            return 0;
        }
    }
    cout<<-1<<endl;
}

B

进制转化题,把两个数先转化为十进制,相加输出答案即可

代码如下

#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;

typedef long long ll;

int main(void)
{
    ios::sync_with_stdio(false);
    int k;
    cin>>k;
    string a,b;
    cin>>a>>b;
    string an="",bn="";
    for(int i=a.size()-1;i>=0;i--)
        an+=a[i];
    for(int i=b.size()-1;i>=0;i--)
        bn+=b[i];
    ll sum1=0,sum2=0,sum;
    for(int i=0;i<an.size();i++)
    {
        sum1+=(ll)pow(k,i)*(an[i]-'0');
    }
    for(int i=0;i<bn.size();i++)
    {
        sum2+=(ll)pow(k,i)*(bn[i]-'0');
    }
    cout<<sum1*sum2<<endl;
}

C

输入一个N,一个大小为N的数组,一个X,请问加到多少次和大于X,当数组用完了从头再来一次。

思路,把数组的和求出来,然后看第几次和大于X,这样就不会超时了。代码如下

#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;

typedef long long ll;

int a[100005];

int main(void)
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    ll sum=0;
    for(int i=0;i<n;i++)
        {
            cin>>a[i];
            sum+=a[i];
        }
    ll x;
    cin>>x;
    ll ans=(x/sum)*n;
    ll rest=x%sum;
    for(int i=0;i<n;i++)
    {
        if(rest<0)
            break;
        rest-=a[i];
        ans++;
    }
    cout<<ans;

}

D

两个操作,把前两个数相加对十求余,加到集合前面,

或者相乘对十求余,加到前面,最后变成一个数。

问每个数有多少种可能?

思路,线性dp,每次加上前一次的即可

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;

typedef long long ll;

int a[100005];
int dp[100005][10];

const int N=998244353;

int n;

int main(void)
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    dp[1][a[1]]=1;
    for(int i=1;i<=n-1;i++)
    {
        for(int j=0;j<=9;j++)
        {
            dp[i+1][(j+a[i+1])%10]=(dp[i][j]+dp[i+1][(j+a[i+1])%10])%N;
            dp[i+1][(j*a[i+1])%10]=(dp[i][j]+dp[i+1][(j*a[i+1])%10])%N;
        }
    }
    for(int i=0;i<=9;i++)
    {
        cout<<dp[n][i]<<endl;
    }
}

F:

我不会写,我也看不太懂,贴一下大佬的答案吧

AtCoder Beginner Contest 220 F - Distance Sums 2_m0_51780913的博客-CSDN博客题目在这里题目描述大致意思就是给你n个点n-1条边,然后依次求出每个点到其他所有点的距离和样例Sample Input 1 31 22 3Sample Output 1 323Sample Input 2 21 2Sample Output 2 11Sample Input 3 61 61 51 31 41 2Sample Output 3 599999算法:推公式加dfs求解O(n)我们先求一个点的∑jNdist(i,j)\suhttps://blog.csdn.net/m0_51780913/article/details/120499103?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163386559116780274184730%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163386559116780274184730&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-3-120499103.pc_search_ecpm_flag&utm_term=F+-+Distance+Sums+2&spm=1018.2226.3001.4187

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值