• Codeforces Gym 100269F Flight Boarding Optimization 树状数组维护dp


    Flight Boarding Optimization

    题目连接:

    http://codeforces.com/gym/100269/attachments

    Description

    Peter is an executive boarding manager in Byteland airport. His job is to optimize the boarding process.
    The planes in Byteland have s rows, numbered from 1 to s. Every row has six seats, labeled A to F.
    F
    E
    D
    C
    B
    A
    1 2 3 4 5 6 7 8 9 10
    ...
    ...
    ...
    ...
    ...
    ...
    s
    Boarding
    There are n passengers, they form a queue and board the plane one by one. If the i-th passenger sits in
    a row ri then the difficulty of boarding for him is equal to the number of passengers boarded before him
    and sit in rows 1 . . . ri −1. The total difficulty of the boarding is the sum of difficulties for all passengers.
    For example, if there are ten passengers, and their seats are 6A, 4B, 2E, 5F, 2A, 3F, 1C, 10E, 8B, 5A,
    in the queue order, then the difficulties of their boarding are 0, 0, 0, 2, 0, 2, 0, 7, 7, 5, and the total
    difficulty is 23.
    To optimize the boarding, Peter wants to divide the plane into k zones. Every zone must be a continuous
    range of rows. Than the boarding process is performed in k phases. On every phase, one zone is selected
    and passengers whose seats are in this zone are boarding in the order they were in the initial queue.
    In the example above, if we divide the plane into two zones: rows 5–10 and rows 1–4, then during the first
    phase the passengers will take seats 6A, 5F, 10E, 8B, 5A, and during the second phase the passengers
    will take seats 4B, 2E, 2A, 3F, 1C, in this order. The total difficulty of the boarding will be 6.
    Help Peter to find the division of the plane into k zones which minimizes the total difficulty of the
    boarding, given a specific queue of passengers.

    Input

    The first line contains three integers n (1 ≤ n ≤ 1000), s (1 ≤ s ≤ 1000), and k (1 ≤ k ≤ 50; k ≤ s).
    The next line contains n integers ri (1 ≤ ri ≤ s).
    Each row is occupied by at most 6 passengers.

    Output

    Output one number, the minimal possible difficulty of the boarding

    Sample Input

    10 12 2
    6 4 2 5 2 3 1 11 8 5

    Sample Output

    6

    Hint

    题意

    现在有n个人,s个位置和你可以划分长k个区域

    你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量

    问你怎么划分这s个位置(当然,每个区域必须是连续的),才能使得总代价最小

    输出代价

    题解:

    数据范围1000,显然的dp

    dp[i][j]表示第i个位置是第j个区域的结尾,然后暴力转移就好了

    用树状数组预处理sum[i][j],表示第i个位置和第j个位置划分在一起的代价是多少

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1050;
    int dp[maxn][55];
    int sum[maxn][maxn];
    int r[maxn];
    int n,m,k;
    int a[maxn];
    vector<int> E[maxn];
    int lowbit(int x)
    {
        return x&(-x);
    }
    int get(int x)
    {
        int ans = 0;
        for(int i=x;i;i-=lowbit(i))
            ans+=a[i];
        return ans;
    }
    void update(int x,int v)
    {
        for(int i=x;i<maxn;i+=lowbit(i))
            a[i]+=v;
    }
    int main()
    {
        freopen("flight.in","r",stdin);
    	freopen("flight.out","w",stdout);
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&r[i]);
            E[r[i]-1].push_back(i);
        }
        for(int i=0;i<m;i++)
        {
            memset(a,0,sizeof(a));
            for(int j=i;j<m;j++)
            {
                if(i!=j)sum[i][j]=sum[i][j-1];
                for(int t=0;t<E[j].size();t++)
                    sum[i][j]+=get(E[j][t]);
                for(int t=0;t<E[j].size();t++)
                    update(E[j][t],1);
            }
        }
    
        for(int i=0;i<=m;i++)
            for(int j=0;j<=k;j++)
                dp[i][j]=1e9;
        dp[0][0]=0;
        for(int i=0;i<m;i++)
            for(int j=0;j<k;j++)
            {
                if(dp[i][j]==1e9)continue;
                for(int t=i;t<m;t++)
                    dp[t+1][j+1]=min(dp[t+1][j+1],dp[i][j]+sum[i][t]);
            }
        cout<<dp[m][k]<<endl;
    }
  • 相关阅读:
    layui自定义滚动条样式
    mongo 数据导入导出方法
    Go Map基本操作增删改查
    golang如何禁用gc?
    Go 切片操作
    Go 协程实现原理和使用示例
    GO语言中 json byte 与map 两种类型的转换
    解压 压缩命令
    Nginx 做转发解决跨域问题
    Go 操作文件 遍历目录获取文件列表
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5199539.html
Copyright © 2020-2023  润新知