zoukankan      html  css  js  c++  java
  • 贪心:磁带最优存储与磁盘文件最优存储

    1、磁带最优存储问题

    Input:

    5
    71 872
    46 452
    9 265
    73 120
    35 87

    Output:

      85.6193

    Code:

    #include <bits/stdc++.h>
    using namespace std;
    
    void Merge(double* arr, int p, int q, int r){
        int Llen = q - p + 1;
        int Rlen = r - q;
        double Larr[Llen + 1];
        double Rarr[Rlen + 1];
    
        for(int i=0; i<Llen; i++){
            Larr[i] = arr[p + i];
        }
        Larr[Llen] = INT_MAX;
        for(int i=0; i<Rlen; i++){
            Rarr[i] = arr[q + 1 + i];
        }
        Rarr[Rlen] = INT_MAX;
        int Lindex=0;
        int Rindex=0;
        for(int i=0; i<r-p+1; i++){
            if(Larr[Lindex] < Rarr[Rindex]){
                arr[p + i] = Larr[Lindex];
                Lindex++;
            }
            else{
                arr[p + i] = Rarr[Rindex];
                Rindex++;
            }
        }
    }
    
    void mySort(double* arr,int p, int r){
        if(p<r){
            int q = (p+r)/2;
            mySort(arr, p, q);
            mySort(arr, q+1, r);
            Merge(arr, p, q, r);
        }
    }
    
    double paixu(int n, int* len, double* rate){
        double Result[n];
    //  1、求出 读取概率 ×长度 
        double rateSum = 0;
        for(int i=0; i<n; i++){
            rateSum += rate[i];
        }
        for(int i=0; i<n; i++){
            rate[i] = rate[i]/rateSum;
        }
        for(int i=0; i<n; i++){
            Result[i] = len[i] * rate[i];
        }
    //  2、对result进行排序,算每个程序的访问时间。
        mySort(&Result[0], 0, n-1);
    //  3、求出n个程序的平均读取时间 
        double result = 0;
        for(int i=0; i<n; i++){
            result += Result[i]*(n-i);
        }
        return result;
    }
    
    int main(){
        int n,len[999];
        double rate[999];
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>len[i]>>rate[i];
        double result = paixu(n, &len[0], &rate[0]);
        cout<<result<<endl;
        return 0;
    }

    2、磁盘文件最有存储问题

    Input:

    5

    33 55 22 11 9

    Output:

    0.547396

     

    Code:

    #include <bits/stdc++.h>
    using namespace std;
    
    void Merge(double* arr, int p, int q, int r){
        int Llen = q - p + 1;
        int Rlen = r - q;
        double Larr[Llen + 1];
        double Rarr[Rlen + 1];
        for(int i=0; i<Llen; i++){
            Larr[i] = arr[p + i];
        }
        Larr[Llen] = INT_MIN;
        for(int i=0; i<Rlen; i++){
            Rarr[i] = arr[q + 1 + i];
        }
        Rarr[Rlen] = INT_MIN;
        int Lindex=0;
        int Rindex=0;
        for(int i=0; i<r-p+1; i++){
            if(Larr[Lindex] > Rarr[Rindex]){
                arr[p + i] = Larr[Lindex];
                Lindex++;
            }else{
                arr[p + i] = Rarr[Rindex];
                Rindex++;
            }
        }
    }
    
    void mySort(double* arr,int p, int r){
        if(p<r){
            int q = (p+r)/2;
            mySort(arr, p, q);
            mySort(arr, q+1, r);
            Merge(arr, p, q, r);
        }
    }
    
    double paixu(double* rate, int n){
        mySort(rate, 0, n-1);
        double rateSum = 0;
        for(int i=0; i<n; i++){
            rateSum += rate[i];
        }
        for(int i=0; i<n; i++){
            rate[i] = rate[i]/rateSum;
        }
        double tmp[n];
        if(n%2 ==1){
            int k = (n-1)/2;
            tmp[k] = rate[0];
            for(int i=k+1; i<n; i++){
                tmp[i] = rate[2*(i-k)];
            }
            for(int i=0; i<k; i++){
                tmp[i] = rate[2*(k-i) - 1];
            }
        }else if(n%2==0){
            int k = (n-1)/2;
            for(int i=k+1; i<n; i++){
                tmp[i] = rate[2*(i-k) - 1];
            }
            for(int i=0; i<=k; i++){
                tmp[i] = rate[2*(k-i)];
            }
        }
        double result = 0;
        for(int i=0; i<n; i++){
            for(int j=i+1; j<n; j++){
                result += tmp[i]*tmp[j]*(j - i);
            }
        }
        return result;
    }
    
    int main(){
        int n;
        double rate[9999];
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>rate[i];
    //    double rate[5] = {33, 55, 22, 11, 9};
        double num = paixu(&rate[0], n);
        cout<<num<<endl;
    }

    参考自:https://www.jianshu.com/p/d3618f030b87

  • 相关阅读:
    〖Linux〗Kubuntu设置打开应用时就只在打开时的工作区显示
    〖Linux〗Kubuntu, the application 'Google Chrome' has requested to open the wallet 'kdewallet'解决方法
    unity, dll is not allowed to be included or could not be found
    android check box 自定义图片
    unity, ios skin crash
    unity, Collider2D.bounds的一个坑
    unity, ContentSizeFitter立即生效
    类里的通用成员函数应声明为static
    unity, Gizmos.DrawMesh一个坑
    直线切割凹多边形
  • 原文地址:https://www.cnblogs.com/cruelty_angel/p/11021445.html
Copyright © 2011-2022 走看看