zoukankan      html  css  js  c++  java
  • 第四章上级实践报告

    一、实践题目

      程序存储问题

    二、问题描述

      有给定长度的n个程序要放在长度为L的磁盘上,计算磁盘上最多能装多少个程序

    三、算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质)

      

      设程序集合E={1,2,3,... ,n }以按程序大小的非减顺序排序,则程序1是其中最小的  

      贪心策略:每次选择当前长度最短的程序放入磁盘

      贪心选择与最优子结构性质:首先必有程序1,不然设A∈E是最优解,且A中最小的程序为k。若k=1,则最优解包含1。若k>1,则活动1必与A中除k以外的程序相容。令B=A-{k}∪{1},则B也是个最优解

                   进一步,若A是原问题的包含程序1的最优解,则A‘=A-{1}是程序集合E'={i∈E:si>f1}的一个最优解

                   不然,设B'是E'的解且|B'|>|A'|,则B'∪{1}是E的解且|B'|+1>|A|。此与A是最优解矛盾。所以必有最短的程序1。

      

    四、算法时间及空间复杂度分析(要有分析过程)

      代码如下:

      

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,l;
    int a[100000];
    
    int main(){
        cin>>n>>l;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        sort(a,a+n-1);
        int ans=0;
        
        for(int i=0;i<n;i++){
            if(l-a[i]>=0){
                l=l-a[i];
                ans++;
            }
        } 
        cout<<ans;
        return 0;
    }
    View Code

      时间复杂度:进行了一次快排,还有一次对数组的遍历,所以时间复杂度为O(nlogn)

      空间复杂度:只开了一个变量用以记录剩余空间,则空间复杂度为O(1)

    五、心得体会(对本次实践收获及疑惑进行总结)

      这道题比较简单,只要想好贪心策略,证明其正确性,基本就可以迎刃而解了。

  • 相关阅读:
    内核随记(三)同步(1)
    排列算法
    SQLite入门与分析(八)存储模型(3)
    内核随记(一)——理解中断(2)
    dup与dup2系统调用
    内核随记(四)文件系统(1)
    SQLite入门与分析(八)存储模型(2)
    SQLite入门与分析(九)VACUUM命令分析
    c中static变量局部变量
    (i++)+(i++)与(++i)+(++i)
  • 原文地址:https://www.cnblogs.com/hxyawsl/p/11884424.html
Copyright © 2011-2022 走看看