陈老师搬书

【问题描述】

陈老师喜欢网购书籍,经常一次购它个百八十本,然后拿来倒卖,牟取暴利。前些天,高一的新同学来了,他便像往常一样,兜售他的书,经过一番口舌,同学们决定买他的书,但是陈老师桌上的书有三堆,每一堆都有厚厚的一叠,他要想个办法用最轻松的方式把书拿下来给同学们.但是你想逗一下陈老师,于是,请你设计一个最累的方式给他.

若告诉你这三堆分别有i,j,k本书,以及每堆从下到上书的重量.每次取书只能从任意一堆的最上面取,那么请你帮助他设计一个方案,让他花最大的力气取下所有书(陈老师别打我).

显然,每次取书,陈老师的体力消耗都会加大,这里用体力系数代表,取下第一本书时,体力系数为1,第二本时为2,依次类推,而每次体力消耗值则为体力系数和书的重量之积。

举个例子:

三堆书及重量如下

不用证明,最累的取书方式为: 右左左中, 即: 3*1+9*2+2*3+10*4=3+18+6+40=67

【输入文件】book.in

输入文件的第一行为3个数,分别为三堆数量I,j,k

第二行至第四行分别为每堆由下至上的书本重量

【输出文件】book.out

输出最累方式的体力消耗总值即可

【输入样例】

3 2 4

2 3 2

1 5

9 8 7 4

【输出样例】

257

【注释】:

输入数据为每堆由下至上的书本重量!

【数据规模】

对于40%的数据有:0<=i<10   0<=j<10   0<=k<10

对于100%的数据有:0<=i<100   0<=j<100   0<=k<100

最后输出的体力消耗总值在longint范围内



一眼望去眼里只有暴搜

  • 40分的大暴力(无思路)

#include<stdio.h>
#include<algorithm>
using namespace std;
long long ans;
int k,w[4][101];

void dfs(int a,int b,int c,long long sum)
{
    if(a==0 && b==0 && c==0) {
        if(sum>ans) ans=sum;
        return ;
    }
    if(a) {
        ++k;
        dfs(a-1,b,c,sum+(k*w[1][a]));
        --k;
    }
    if(b) {
        ++k;
        dfs(a,b-1,c,sum+(k*w[2][b]));
        --k;
    }
    if(c) {
        ++k;
        dfs(a,b,c-1,sum+(k*w[3][c]));
        --k;
    }
}

int main()
{
    freopen("book.in","r",stdin);
    freopen("book.out","w",stdout);
    for(int i=1;i<=3;++i) {
        scanf("%d",&w[i][0]);
    }
    for(int i=1;i<=3;++i)
        for(int j=1;j<=w[i][0];++j) {
            scanf("%d",&w[i][j]);
        }

    dfs(w[1][0],w[2][0],w[3][0],0);
    printf("%lld",ans);
    return 0;
}
  • 正解DP做法

F[i][j][k]表示目前第1堆剩余i本,第2堆剩余j本,第3堆剩余k本的最大劳累值

f[i][j][k]=max(max(f[i+1][j][k]+d[i+1]*t,f[i][j+1][k]+e[j+1]*t),f[i][j][k+1]+g[k+1]*t);

t=a+b+c-i-j-k

其中a,b,c为3堆书本的数量,d[i],e[i],g[i]对应3堆书中第i本书的质量

#include<stdio.h>
#include<algorithm>
using namespace std;
int k[4],bok[4][101],f[101][101][101];

int main()
{
    freopen("book.in","r",stdin);
    freopen("book.out","w",stdout);
    for(int i=1;i<=3;++i)
        scanf("%d",&k[i]);

    for(int i=1;i<=3;++i)
        for(int j=1;j<=k[i];++j)
            scanf("%d",&bok[i][j]);

    for(int i=k[1];i>=0;--i)
        for(int j=k[2];j>=0;--j)
            for(int l=k[3];l>=0;--l)
            {
                int t=k[1]+k[2]+k[3]-(i+j+l);
                f[i][j][l]=max(max(f[i+1][j][l]+bok[1][i+1]*t,f[i][j+1][l]+bok[2][j+1]*t),f[i][j][l+1]+bok[3][l+1]*t);
            } 

    printf("%d",f[0][0][0]);
    return 0;
}
/*
3 2 4
2 3 2
1 5
9 8 7 4
*/

原文地址:https://www.cnblogs.com/qseer/p/9501788.html

时间: 2024-11-09 00:09:51

陈老师搬书的相关文章

【DFS】搬书

描述 陈老师桌上的书有三堆,每一堆都有厚厚的一叠,你想逗一下陈老师,于是你设计一个最累的方式给他,让他把书拿下来给同学们.若告诉你这三堆分别有i,j,k本书,以及每堆从下到上书的质量,每次取书只能从任一堆的最上面取,显然,每次取书陈老师的体力消耗都会加大,这里用体力系数代表,取下第一本书时,体力系数为1,第二本书时体力系数为2,依次类推,而每次体力消耗值则为体力系数与书的重量之积.书最多有100本. 输入 第一行3个整数,分别为三堆书的数量i,j,k:第二行至第四行分别为每堆由下至上的书本重量.

YESLAB 7月12日陈老师CCNA+CCNP真机Rack实战课程

CCNA 是网络行业的入门课程,为了能够让学员很好的了解网络,Yeslab提供真实设备Rack,学员实战搭建拓扑.完成配置,为学员打造一个真实的网络,总之只要学员想学,Yeslab毫不吝啬 CCNP路由部分为IE的基础,只有基础打的牢,楼才能盖得高,Yeslab拒绝Paper IE,除此之外Yeslab还针对工作特别开发了面试模拟课程,可以针对集成商,厂商的职位进行不同级别的面试,能够让学员不单单的只是找到工作,而是对职业有个好的规划. 交换一直是思科培训里比较弱化的一门,不过Yeslab提供真

对于牛老师作业陈老师作业补充(老陈、小石头的典型用户、用例图、场景)

对于牛老师作业陈老师作业补充(老陈,小石头的典型用户.用例图.场景) 一  :  典型用户 (1)名字:小石头 性别:男 年龄:    8岁 职业:学生 收入:无 知识层次能力:小学二年级 生活/工作情况:父母抚养,无工作 动机,目的,困难:想测试自己的运算速度 用户偏好:上网,打小游戏,看动画片 典型场景:放学回家后,老陈了解他的学习情况 典型描述:正确率越高,小石头学的越好 (2)名字:老陈 性别:男 职业:大学教师 年龄:   40岁 收入:6000/月 知识层次能力:本科毕业 生活/工作

陈老师的作业

典型用户故事 (1)典型用户:老陈[主要].小石头[次要]. 姓名 老陈 性别  年龄 男  45岁 收入 8万/年 知识层次和能力 大学本科 能够熟练操作电脑 生活/工作情况 已婚,大学教师 动机,目的, 希望自己的孩子成绩有所提高:腾出时间做自己的事:想通过一款软件帮助自己辅导孩子学习 用户偏好 看书   户外运动 用户比例 ? 典型场景 需要一款软件帮助自己辅导孩子提高孩子的数学成绩 典型描述 工作繁忙  没有时间辅导孩子 姓名 小石头 姓名   性别 男  8岁 收入 无 职业 小学二年

运用.NIT将数据存入数据库、读取数据库(运用封装)陈老师作业

我基础不好,根据所学的知识,书本的例题修改的,也不知道我理解的是否符合老师要求 运用C#将数据存入数据库.并且可以读取数据库里的数据,此项目我运用了封装.我运用了一个窗体将数据存读数据. 我首先创建了一个数据库,库名“数学题库” ,然后创建了一个表“tiku1”, 添加一个类Class1 class Class1    {        public string strCon = @"Data Source=.;Initial Catalog=数学题库;Integrated security=

陈老师让发布的——计算机的典型用户和场景

一.典型用户 (1)老陈先生是一个学过软件编程的IT人士,简介如下: 姓名:老陈 年龄:40岁 职业:程序员 收入:年薪10万 学历:本科计算机应用技术专业 目的动机:为了帮助儿子小石头联系10以内的连加连减运算 爱好:读书,运动 典型场景:让儿子能用软件来做家庭作业,减轻自己辅导儿子学习的负担 典型描述:儿子也喜欢这样的辅导方式,成绩也提高了 (2)小石头是老陈先生的儿子,刚上小学二年级,简介如下: 姓名:小石头 年龄:10岁 职业:小学生 收入:0 学历:刚上小学二年级 目的动机:完成爸爸布

对于牛老师作业陈老师作业补充(老陈,小石头的典型用户、用例图、场景)

典型用户 名字:小石头 性别:男 职业:小学二年级学生 收入:无 知识层次能力:小学二年级 生活/工作情况:父母抚养,无工作 动机,目的,困难:想测试自己的运算速度 用户偏好:玩, 典型场景:放学回家后,老陈了解他的学习情况 典型描述:正确率越高,小石头学的越好 名字:老陈 性别:男 职业:大学教师 收入:5000/月 知识层次能力:本科毕业 生活/工作情况:生活美满,工作很好 动机,目的,困难:想测试孩子的学习 用户偏好:专研计算机, 典型场景:放学回家后,解决不能辅导孩子的空缺 典型描述:正

陈老师布置的作业

典型用户1 典型用户2 用户故事:      作为一名家长,我希望用计算机软件帮助我辅导孩子做作业,以便节省我的时间.     作为一名小学生,我希望通过计算机帮助我完成家庭作业,并且可以对我完成作业 的情况进行评价,以便我了解自己的学习情况. 用例图:

hlg1175小陈老师、桌子、盘子【计算几何】

大意:一个R的桌子能否摆下n个半径为r的盘子  要求所有的盘子靠桌子的边缘放置 分析: 两种思路 一种是看这个桌子放这种盘子最多放多少个 一种是把这种盘子n个放在这个桌子上最少需要多大桌子半径 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 7 const int maxn = 105;