第四章上机实践报告

1.程序存储问题

2.问题描述

 

 3.算法描述

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 int main(){
 6     int n,L;
 7     cin >> n >> L;
 8     int a[n];
 9     for(int i=0;i<n;i++){
10         cin >> a[i];
11     }
12     int min = a[0];
13     sort(a,a+n);
14     int sum = 0; 
15     int count = 0; 
16     for(int i=0;i<n;i++){
17         if((sum+a[i])<=L){
18             sum = sum + a[i];
19             count++ ;
20         }
21         else break;
22     }
23     cout << count ;
24     return 0;
25 } 
程序存储问题

数据结构:①n:文件个数;L:磁带长度;②a[n]存放每个程序存放在磁带上的长度;

③sum:记录已存放的程序的长度;④count:记录存放的文件的个数

(1)该算法调用了<algorithm>中的sort函数,将a数组递增排列

(2)先将程序长度小的程序存入文件,当存入的长度超过磁带长度的时候,就不再放入

1     for(int i=0;i<n;i++){
2         if((sum+a[i])<=L){
3             sum = sum + a[i];
4             count++ ;
5         }
6         else break;
7     }
核心算法

反证法证明:

设有程序长度集合E={a,b,c,d.......n}以程序长度的非减顺序排列,程序a具有最短长度

①首先必定有最优解包含程序a;

②设A包含于E是最优解且A中长度最短的程序是k。若k=a,则最优解包含程序a;

若k不等于a,则程序a 必与A中除a以外的程序相容。

另B = A - {k} ∪ {a},则B也是一个最优解

③若A是原问题的包含程序a的最优解,则 A’ = A - {a}是程序长度集合E’ = {i∈E , Si ≥ F1}的一个最优解

④设B’是E’的解且|B’|>|A'|,则B’∪{a}是E的解且|B’|+a >|A| 。此与A是最有解矛盾

4.算法时间和空间复杂度分析

时间复杂度:T(n)= O(n)只用了一个for循环

空间复杂度:S(n)= O(1)没有申请额外的空间

5. 心得体会

这次上机的第一道题程序存储问题比较简单,很快就打出来了,但是老师有提到,排序时最好直接用sort不要自己再写,考试时也是节约时间。除此之外,上机的第二三道题目,有些测试点比较难过,特别是第二道题有10个测试点,确实比较难顶,也在一步步摸索,希望尽快打出来。

 

 

 

posted on 2019-11-17 20:02  流星雨lxy  阅读(118)  评论(0编辑  收藏  举报

导航