Примеры:

Input :
Enter No. of Tapes:4
Enter No. of Programs:9
Enter Job Name of 0 :a
Enter Job Size of 0 :12
Enter Job Name of 1 :b
Enter Job Size of 1 :13
Enter Job Name of 2 :c
Enter Job Size of 2 :10
Enter Job Name of 3 :d
Enter Job Size of 3 :8
Enter Job Name of 4 :e
Enter Job Size of 4 :7
Enter Job Name of 5 :f
Enter Job Size of 5 :3
Enter Job Name of 6 :g  
Enter Job Size of 6 :20
Enter Job Name of 7 :2
Enter Job Size of 7 :2
Enter Job Name of 8 :i
Enter Job Size of 8 :5
 : 
Output :
Tape Storage
7 3 6 
5 2 -1 
8 0 -1 
4 1 -1 
ID	Name	Size	Retrieval Time
0	a	12	17.00
1	b	13	20.00
2	c	10	13.00
3	d	8	10.00
4	e	7	7.00
5	f	3	3.00
6	g	20	30.00
7	h	2	2.00
8	i	5	5.00
Minimum Retrieval Time : 8.88
 :
Input :
Enter No. of Tapes:3
Enter No. of Programs:5
Enter Job Name of 0 :a
Enter Job Size of 0 :6
Enter Job Name of 1 :b
Enter Job Size of 1 :4
Enter Job Name of 2 :c
Enter Job Size of 2 :2
Enter Job Name of 3 :d
Enter Job Size of 3 :8
Enter Job Name of 4 :e
Enter Job Size of 4 :10
Output :
Tape Storage
2 3 
1 4 
0 -1 
ID	Name	Size	Retrieval Time
0	a	6	6.00
1	b	4	4.00
2	c	2	2.00
3	d	8	10.00
4	e	10	14.00
Minimum Retrieval Time : 7.20

#include"stdio.h"
#include"stdlib.h"
#include"string.h"

struct jobs // структура для хранения идентификатора задания, имени (имя с пробелами), размера, а затем распределяется там
{ //время извлечения
int id;
int size;
char имя[20];
double rt;
};

void displayresult(struct jobs *jb, double ans, int n) // отображать результаты как окончательный вывод
{
printf("\n");
printf("ID\tName\tSize \tВремя извлечения\n”);
for(int i=0;i‹n;i++)
{
printf(“%d\t%s\t%d\t% .2f\n",jb[i].id,jb[i].name,jb[i].size,jb[i].rt);
}
printf("Минимальное время поиска : %.2f “,ans/n);
}

void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}

int heapify(int arr[], int n, int i,struct jobs *jb)
{
int наибольший = i;
int l = 2*i + 1;
int r = 2*i + 2;
int cnt=0;

if (l jb[arr[самый большой]].size)
самый большой = l; снт++;

if (r jb[arr[наибольший]].size)
наибольший = r; снт++;

if (наибольшее != i)
{
swap(&arr[i], &arr[наибольшее]);

heapify(arr, n, наибольший,jb);
}
return cnt;
}

void heapSort(int arr[], int n,struct jobs *jb)
{
int cnt=0;
for (int i = n / 2–1; i ›= 0; i–)
cnt += heapify(arr, n, i,jb);

for (int i=n-1; i›=0; i–)
{
swap(&arr[0], &arr[i]);
cnt += heapify(arr, i, 0,jb);
}
//printf(“count: %d”,cnt);
}

void absolutestorage(struct jobs *jb,int n,int t)
{
int *x,i,j;
int sum=0;
double ans;
> /*так что здесь я поддерживаю динамический массив, в котором будут храниться все идентификаторы заданий, которые будут в том же порядке, что и введенные пользователем, чтобы после выполнения сортировки по размеру задания мы не изменили порядок задания, вставленный пользователем*/

x = (int *)malloc(n*sizeof(int));
for(i=0;i‹n;i++)
{
x[i] = jb[i] .id;
}

сортировка кучи(x,n,jb); // сортировка кучи используется для сортировки массива «x»

// начинается решение с несколькими лентами

int row = t,col=0;
if(n%t == 0)
{
col = n/t;
}
else
{
столбец = (n/t)+1;
}

/*это матрица, которая используется для поддержки нескольких лент и инициализируется с помощью -1*/
int *mat;
mat = (int *)malloc(row*col*sizeof(int)) ;
for(i=0;i‹row;i++)
{
for(j=0;j‹col;j++)
{
*(mat + i*col +j)=-1;
}
}

/*здесь мы вычисляем оптимальное время поиска для каждого задания в соответствии с порядком ленты*/
int k =0;
for(i=0;;i++)
{
for (j=0;j‹row;j++)
{
*(mat + (j)*col +i) = x[k];
if(i==0)< br /> {
jb[x[k]].rt = jb[x[k]].size;
ans += jb[x[k]].rt;
}
else
{
jb[x[k]].rt = jb[x[k]].size + jb[*(mat + (j)*col +i-1) ].rt;
ans += jb[x[k]].rt;
}
k++;
if(k == n)
{
break;
}
}
if(k == n)
{
break;
}
}
//отображение ленточного хранилища
printf("\nTape Storage\n");
for(i=0;i‹row;i++)
{
for(j= 0;j‹col;j++)
{
printf("%d",*(mat + i*col +j));
}
printf("\n ”);
}

отображатьрезультат(jb,ans,n);

бесплатно(мат);
бесплатно(x);
вернуть ;
}

int main(int argc, char const *argv[])
{
int n,i,j,k,t;
printf("Введите количество лент:");< br /> scanf("%d",&t);

printf("Введите количество программ:");
scanf("%d",&n);

структура заданий *jb;
jb = (структура заданий *)malloc(n*sizeof(структура заданий));

for(i=0;i‹n;i++)
{
jb[i].id = i;
printf("Введите имя задания %d :",i);< br /> scanf («%[^\t\n]s», jb[i].name);
printf («Введите размер задания %d :», i);
scanf( “%d”,&jb[i].size);
}

/*если мое количество заданий меньше или равно no. лент, то мы можем просто выделить
время извлечения для них*/
if(n‹=t)
{
int ans=0;
for(i =0;i‹n;i++)
{
jb[i].rt = jb[i].size;
ans += jb[i].size;
}
printf("\nTape Storage\n");
for(i=0;i‹n;i++)
{
printf("\nTape %d :% d”,i,jb[i].id);
}

displayresult(jb,ans,n);
}
else /*else вызывает функцию оптимального хранения для расчета*/
{
absolutestorage(jb,n,t); }

бесплатно (JB);

вернуть 0;
}

Эта статья предоставлена ​​Вигнешем Тивари.