磁盘文件最优存储问题
/* 贪心书法——磁盘文件最优存储问题
将概率最大的放在中间,依次左右两边排较小的
2019-04-27
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std ;
int cmp(int a, int b)
{
return (a > b);
}
/*将数组a的值排序使其元素的分布从中间往两边依次减少*/
void strageSort(int n, int a[])
{
int i, k, mid;
sort(a, a + n, cmp);
mid = n / 2;
int * b = (int *)malloc(sizeof(int) * (n+1)); // 分配存储空间
b[mid] = a[0]; // 将最大数放在中间
for (i = 1, k = 1; i< n; i++, k++)
{ //数组a的值分布从中间往两边依次减少
b[mid - k] = a[i];
i++;
if (i != n)
b[mid + k] = a[i];
}
for (int i = 0; i<n; i++)
{ //经变化后的a数组
a[i] = b[i];
}
}
/*计算排序之后检索n个文件的期望时间*/
double minStorage(int n, int a[])
{
int sum = 0;
for (int i = 0; i<n; i++) {
sum += a[i];
}
double result = 0;
for (int i = 0; i<n; i++) {
for (int j = i + 1; j<n; j++) { //从磁道0-n-1。计算它们的磁道间的检索时间
result += (a[i] * 1.0 / sum)*(a[j] * 1.0 / sum)*(j - i);
}
}
return result;
}
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt", "w", stdout);
int N; // 输入文件个数
cin >> N; //
int * Pro = (int *)malloc(sizeof(int) * N); // 分配存储空间
for (int i = 0; i < N; i++)
{
cin >> Pro[i];
}
strageSort(N, Pro);
double res = minStorage(N, Pro);
cout << res;
fclose(stdin);
fclose(stdout);
return 0;
}
更多精彩

