蓝桥杯2020省赛真题J 怪物猎人 装饰珠 问题(C++解法)(下)

简介: 蓝桥杯2020省赛真题J 怪物猎人 装饰珠 问题(C++解法)(下)

C++代码如下


#include <iostream>
#include <cstring>
#include <aLgorithm>
using namespace std;
constexpr size_t MAXN = 55, MAXS = 305, MAXM = 1e4 + 5;
int n[MAXN], cnt[5], Lv[MAXM], p[MAXM], w[MAXM][MAXN];
int dp[MAXM][MAXS];
int m;
inline void Read() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    for (int i = 1; i <= 6; i++) {
        cin >> n[i];
        for (int j = 1, x; j <= n[i]; j++) { cin >> x; cnt[x]++; }
    }
    cin >> m;
    for (int i = 1; i <= m; i++) {
        cin >> Lv[i] >> p[i];
        for (int j = 1; j <= p[i]; j++)
            cin >> w[i][j];
    }
}
inline int DP() {
    memset(dp, 0x80, sizeof dp), dp[0][0] = 0;
    int ans = 0, sum = 0, tot = 0;
    for (int L = 4; L >= 1; L--) {
        sum += cnt[L];
        for (int i = 1; i <= m; i++)
            if (Lv[i] == L) {
                tot++;
                for (int k = 0; k <= sum; k++)
                    dp[tot][k] = dp[tot - 1][k];
                for (int j = 1; j <= p[i]; j++)
                    for (int k = j; k <= sum; k++)
                        dp[tot][k] = max(dp[tot][k], dp[tot - 1][k - j] + w[i][j]);
            }
    }
    for (int i = 0; i <= sum; i++) ans = max(ans, dp[tot][i]);
    return ans;
}
signed main() {
    Read();
    cout << DP();
}


java代码如下


import java.util.*;
public class Main {
public static void main(String[] args) {
    int []zhu,l= new int[]{0,0,0,0,0,0};
    int[][] zsk;
    Scanner sc=new Scanner(System.in);
    for(int i=0;i<6;i++) {
        int ko=sc.nextInt();
        for(int j=0;j<ko;j++) {
            int li=sc.nextInt();
            l[li+1]++;
        }
    }
    int M=sc.nextInt();
    int z=l[4]+l[5]+l[2]+l[3];
    l[3]=l[2]+l[3];
    l[4]=l[3]+l[4];
    zsk=new int[M+1][z+1];
    for(int i=0;i<z+1;i++)zsk[0][i]=0;
    for(int i=0;i<M+1;i++)zsk[i][0]=0;
    for(int i=1;i<M+1;i++) {
        int bt=i;
        int li=sc.nextInt();
        int lim=sc.nextInt();
        zhu=new int[lim];
        for(int j=0;j<lim;j++)zhu[j]=sc.nextInt();
        for(int i1=1;i1<l[li]+1;i1++)zsk[M][i1]=zsk[M-1][i1];
        for(int i1=l[li]+1;i1<z+1;i1++) {
            int max=0;
            for(int j=0;i1-j-1>=l[li]&&j<zhu.length;j++)
                max=Math.max(max, zhu[j]+zsk[i-1][i1-j-1]);
            max=Math.max(max, zsk[i-1][i1]);
            zsk[i][i1]=max;
        }
    }
    System.out.println(zsk[M][z]);
}
}

python解法如下


import os
import sys
s = [];r = [];m = []
for i in range(6):
    s.append(list(map(int,input().split())))
n = int(input())
for i in range(n):
    r.append(list(map(int,input().split())))
for i in range(6):
    p = s[i]
    for j in range(n):
        if i == 0:
            m.append(p[1:].count(int(j+1)))
        else:
            m[j] += p[1:].count(int(j+1))
'''print(m)''' '''用m[j]记录6件装备共有 j+1级孔m[j]个'''
mm = m'''假设j级孔全用j级珠子'''
up = [];down = [];'''up记录加一颗珠子提升的价值,down记录少一颗珠子减少的价值'''
def up1(k):
    if mm[k]>=r[k][1]:
        return 0
    elif mm[k] == 0:
        return r[k][2]
    else:
        return r[k][2+mm[k]]-r[k][1+mm[k]]
def down1(k):
    if mm[k] == 1:
        return r[k][2]
    elif mm[k]>r[k][1]:
        return 0
    else :
        return r[k][1+mm[k]]-r[k][mm[k]]
for i in range(n):
    up.append(up1(i))
    down.append(down1(i))
'''print(up,down)'''
'''第n+1级孔,如果1到n级孔中珠子加1的价值比它减少1颗的价值大,则数值各加1、减1,up、down更新'''
def main1(n):
    if n == 0:
        return
    while max(up[:n])>down[n] and mm[n]>0:
        t = up.index(max(up[:n]))
        mm[t] += 1
        up[t] = up1(t)
        mm[n] -= 1
        down[n] = down1(n)
    main1(n-1)
    return
point = 0
main1(n-1)'''输入有n级,为了和形参统一,此处减1'''
'''print(up,down)
print(mm)'''
for i in range(n):
    if mm[i] != 0:
        point += r[i][1+mm[i]]
print(point)'''得到总价值'''


相关文章
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
第十四届蓝桥杯省赛大学B组(C/C++)整数删除
|
5月前
|
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
115 5
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
2月前
|
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
74 19