• 贪心:磁带最优存储与磁盘文件最优存储


    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

  • 相关阅读:
    c# 通过Windows服务启动外部程序
    MVC 视图页对数字,金额 用逗号 隔开(数字格式化)
    mvc4 @foreach 如何写@if 判断
    最小生成树Prim算法和Kruskal算法
    Triangle War
    定制kickstart重建CentOS7.5镜像用于U盘引导安装
    有限状态机FSM
    最短路经算法简介(Dijkstra算法,A*算法,D*算法)
    利用/dev/urandom文件创建随机数
    A*搜索算法
  • 原文地址:https://www.cnblogs.com/cruelty_angel/p/11021445.html
Copyright © 2020-2023  润新知