Примеры:
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;
}
Эта статья предоставлена Вигнешем Тивари.