AtCoder Beginner Contest 118题解报告

作者 : 开心源码 本文共2003个字,预计阅读时间需要6分钟 发布时间: 2022-05-12 共208人阅读

A

#include <iostream>using namespace std;int main(){    int a, b;    cin >> a >> b;    cout << (b % a ? b - a : b + a) << endl;    return 0;}

B

#include <bits/stdc++.h>using namespace std;int main(){    int N, M;    cin >> N >> M;    vector<int> cnt(M);    for (int i = 0; i < N; i++)    {        int K;        cin >> K;        for (int j = 0; j < K; j++)        {            int A;            cin >> A;            A--;            cnt[A]++;        }    }    int ans = 0;    for (int i = 0; i < M; i++)    {        if (cnt[i] == N)        {          ans += 1;        }    }    cout << ans << endl;}

C

分析:
一一求最大公约数就行。

代码:

#include<bits/stdc++.h>using namespace std;int gcd(int a,int b){   return (0 == b) ? a : gcd(b, a % b);}int main(){    int N;    cin >> N;    int A[N];    for(int i=0;i<N;i++)    {       cin>>A[i];    }    int ans = A[0];    for(int i=1;i<N;i++)    {        ans = gcd(ans,A[i]);    }    cout << ans << endl;    return 0;}

D

分析:
本题可以使用动态规划来处理。以样例1为例 来分析。
20 4
3 7 8 4
(1)可先对Ai按从大到小的顺序进行排序: 8 7 4 3
(2)数据的对应关系为

0 ? 0 1 ? 22 ? 53 ? 54 ? 45 ? 56 ? 67 ? 38 ? 79 ? 6

所以,样例1中数据的对应关系为

8 ? 77 ? 34 ? 43 ? 5

所以,映射前的数组A[] = {8, 7, 4, 3},映射后的数组map[] = {7, 3, 4, 5}
(3)考虑到string重载了“+”运算符,可以很方便地将数字(字符)连接起来。
比方”7”+”7”=”77”, 或者”77777” + “3” = “777773”。
可以公告vector<string> dp,刚开始时,dp[i]都为””。dp中存放的是结果。
样例1中N=20,则最终要求的是dp[20]。
(4)
根据样例1中数据的对应关系,dp[7]=”8”, dp[3]=”7”, dp[4] = “4”, dp[5] = “3”。
接着从1开始枚举dp。
N = 1时,dp[1] = “”, 也就是说,{8,7,4,3}无法组成各位数之和为1的数。
N = 2时,dp[1] = “”, 也就是说,{8,7,4,3}无法组成各位数之和为2的数。
N = 3时,dp[3] = “7”。
N = 4时,dp[4] = “4”。
N = 5时,dp[5] = “3”。
N = 6时,6 = 3 + 3。3对应的数是7,所以dp[6] = “7” + “7” = “77”。
N = 7时,dp[7] = “7”。另外7 = 3 + 4 = 4 + 3,3对应的是7,4对应的是4。所以dp[7] = “74”或者dp[7] = “47”。取最大值dp[7] = “74”。
N = 8时,dp[8] = 3 + 5 = 4 + 4 = 5 + 3。3对应着7,4对应着4,5对应着3,则dp[8] = “73”或者“44”或者“37”,取最大值dp[8] = “73”。
N = 9时,dp[9] = dp[6] + 3 = “777”。
……
最终,dp[20]即为所求。

代码:

#include <iostream>#include <vector>#include <algorithm>using namespace std;vector<int> m = {0, 2, 5, 5, 4, 5, 6, 3, 7, 6};string getMax(string a, string b){    if(a.length() > b.length())    {        return a;    }    else if(a.length() < b.length())    {        return b;    }    else  //假如长度相等,返回字典序较大的字符串    {        return a > b ? a : b;    }}int main(){    int N, M;    cin >> N >> M;    vector<int> A(M, 0);    for(int i = 0; i < M; i++)    {        cin >> A[i];    }    sort(A.begin(), A.end(), greater<int>());    vector<string> dp(max(N+1,10), "");    for(int i = 0; i < M; i++)    {        dp[m[A[i]]] = getMax(dp[m[A[i]]], to_string(A[i]));    }    for(int j = 0; j <= N; j++)    {        for(int i = 0; i < M; i++)        {            if(j - m[A[i]] >= 0 && dp[j-m[A[i]]] != "")            {                dp[j] = getMax(dp[j], dp[j-m[A[i]]] + to_string(A[i]));            }        }    }    cout << dp[N] << endl;    return 0;}

TopCoder & Codeforces & AtCoder交流QQ群:648202993

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » AtCoder Beginner Contest 118题解报告

发表回复