代码改变世界

第四章实践报告

2018-12-02 21:39  WallWallWall  阅读(129)  评论(0)    收藏  举报

一、题目:

程序存储问题

二、题目描述:

设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。

三、算法描述

①原代码:

 

import java.util.Arrays;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int L = scanner.nextInt();
int[] Array = new int[n];
for (int i = 0; i < Array.length; i++) {
Array[i] = scanner.nextInt();
}

Arrays.sort(Array);//函数排序

int midcount = 0;
for (int i = 0; i < Array.length; i++) {
L -= Array[i];
if(L>=0){
midcount++;//统计次数,如果小于0说明长度溢出
}
else break;
}

System.out.println(midcount);
}
}

②算法分析:

a.首先将输入的数据进行排序;

b.通过贪心算法的思想,从最小长度的程序开始存入,并设置midcount变量来统计存入程序数量。

c.判断:若L长度在存入过程中小于0,则说明长度溢出,直接输出midcount。

四、算法空间和时间复杂度分析

Arrays.sort()函数使用的是快速排序,时间复杂度为O(nlogn),所以总时间复杂度为:O(nlogn)

空间复杂度为O(n)

五、心得体会

整体的问题难度较低,十分明显的将贪心算法思想化用就可以解决了,在排序后进行的贪心选择对与选择条件的判断也是整个算法成功与否的关键,所以这也是在学习贪心算法时候要注意的点。