华为OD机试 通过软盘拷贝文件

题目描述

有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究但此电脑除了有一个3.5寸软盘驱动器以外,没有任何手段可以将文件持贝出来,而且只有一张软盘可以使用.因此这一张软盘是唯一可以用来拷贝文件的载体。

科学家想要尽可能多地将计算机中的信息拷贝到软盘中,做到软盘中文件内容总大小最大.已知该软盘容量为1474560字节。文件占用的软盘空间都是按块分配的,每个块大小为512个字节.个块只能被一个文件使用。拷贝到软盘中的文件必须是完整的,且不能采取任何压缩技术

输入描述第1行为一个整数N,表示计算机中的文件数量。1≤ N < 1000.接下来的第2行到第N+1行(共N行),每行为一个整数,表示每个文件的大小Si,单位为字节.0<i< N,0< Si< 1000000

输出描述

科学家最多能拷贝的文件总大小

备注

为了充分利用软盘空间,将每个文件在软盘上占用的块记录到本子上。即真正占用软盘空间的只有文件内容本身

用例

输入

3

737270

737272

737288

输出

1474542

动态规划 二维dp数组和滚动数组两个解

二维递推式含义:当前点dp值=max(能放入编号i之前所有文件的情况下页的数量为j时能存储的最大实际文件大小,能放入编号i之前所有文件的情况下页的数量为(j-文件i所占空间)时能存储的最大实际文件大小+文件i实际文件大小)

即dp[i - 1][j]=能放入编号i之前所有文件的情况下,页的数量为j时能存储的最大实际文件大小(不选择放入文件i)

dp[i - 1][j - block[i]] + byte[i]=能放入编号i之前所有文件的情况下,页的数量为(j-文件i所占空间)时能存储的最大实际文件大小+文件i实际文件大小(选择放入文件i)

#include <bits/stdc++.h>
using namespace std;


int main() {
    int num;
    vector<int>byte;//存储每个文件的大小
    vector<int>block;//存储每个文件所占页数
    cin >> num;
    vector<vector<int>>dp(num,vector<int>(2881,0));//题目给出了总空间和页大小 共2880个页
    int tmp;
    for (int i = 0; i < num; i++) {
        cin >> tmp;
        byte.push_back(tmp);
        if (tmp % 512 == 0) {
            tmp /= 512;
            block.push_back(tmp);
        }
        else {//进一
            tmp /= 512;
            tmp ++;
            block.push_back(tmp);
        }
    }
    for (int i = block[0]; i <2881; i++) {//第一行初始化 第一行代表在仅能放入文件0的情况下,页的数量为i时能存储的最大实际文件大小,空间大小为block[0]之后的元素均初始化为byte[0]
        dp[0][i] = byte[0];
    }
    for (int i = 1; i < num; i++) {
        for (int j = block[i]; j <2881; j++) 
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - block[i]] + byte[i]);
    }
        cout << dp[num-1][2880];
}

滚动数组

include <bits/stdc++.h>
using namespace std;


int main() {
    int num;
    vector<int>byte;//存储每个文件的大小
    vector<int>block;//存储每个文件所占页数
    cin >> num;
    vector<int>dp(2881, 0);//题目给出了总空间和页大小 共2880个页
    int tmp;
    for (int i = 0; i < num; i++) {
        cin >> tmp;
        byte.push_back(tmp);
        if (tmp % 512 == 0) {
            tmp /= 512;
            block.push_back(tmp);
        }
        else {//进一
            tmp /= 512;
            tmp++;
            block.push_back(tmp);
        }
    }
    for (int i = 0; i < num; i++) {
        for (int j = 2880; j >= block[i]; j--)//反向遍历背包
            dp[j] = max(dp[j], dp[j - block[i]] + byte[i]);
    }
    cout << dp[2880];
}

全部评论

相关推荐

诨号无敌鸭:恭喜佬,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务