zoukankan      html  css  js  c++  java
  • XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem J. Terminal

    题目:Problem J. Terminal
    Input file: standard input
    Output file: standard input
    Time limit: 2 seconds
    Memory limit: 256 mebibytes
    N programmers from M teams are waiting at the terminal of airport. There are two shuttles at the exit
    of terminal, each shuttle can carry no more than K passengers.
    Now employees of the airport service need to choose one of the shuttles for each programmer. Note that:
    programmers already formed a queue before assignment to the shuttles;
    each second next programmer in the queue goes to the shuttle he or she is assigned for;
    when all programmers, assigned to the shuttle, are in, shuttle immediately closes door and leaves
    the terminal;
    no two programmers from the same team may be assigned to the different shuttles;
    each programmer must be assigned to one of shuttles.
    Check if its possible to find such as assignment; if the answer is positive, find minimum sum of waiting
    times for each programmer. Waiting time for a person is defined as time when shuttle with this person
    left the terminal; it takes one second to programmer to leave the queue and enter the assigned shuttle.
    At moment 0 the first programmer begins moving to his shuttle.
    Input
    First line of the input contains three positive integers N, M and K (M 2000, M N 105, K 105).
    Second line contains description of the queue — N space-separated integers Ai — ids of team of each
    programmer in order they are placed in the queue (1 Ai M).
    Output
    If it is impossible to assign programmers to she shuttles following the rules above, print -1. Otherwise
    print one integer — minimum sum of waiting times for all programmers.
    Examples

    standard input standard input
    7 3 5
    2 2 1 1 1 3 1
    39
    12 3 9
    1 1 1 2 3 2 2 2 2 2 2 2
    116
    2 1 2
    1 1
    4


    思路:

       如果存在可行解,那么最后一个人一定会上车,不如直接选定上第二辆车,所以第二辆车是第n秒开的。

      然后枚举上第一辆车的最后一个队的最后一个人是什么时候上车的。

      怎么判断可行呢?01背包即可。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 #define MP make_pair
     6 #define PB push_back
     7 typedef long long LL;
     8 typedef pair<int,int> PII;
     9 const double eps=1e-8;
    10 const double pi=acos(-1.0);
    11 const int K=1e6+7;
    12 const int mod=1e9+7;
    13 
    14 int n,m,k;
    15 LL ls[3000],rd[3000],cnt[3000];
    16 LL ans=2e18;
    17 bool dp[2][101005];
    18 bool cmp(int a,int b)
    19 {
    20     return ls[a]<ls[b];
    21 }
    22 int main(void)
    23 {
    24     //freopen("in.txt","r",stdin);
    25     scanf("%d%d%d",&n,&m,&k);
    26     for(int i=1;i<=m;i++) rd[i]=i;
    27     for(int i=1,x;i<=n;i++)
    28         scanf("%d",&x),ls[x]=i,cnt[x]++;
    29     sort(rd+1,rd+m+1,cmp);
    30     dp[0][0]=1;
    31     for(int i=1,now=1,pre=0;i<=m;i++)
    32     {
    33         //printf("%d
    ",rd[i]);
    34         for(int j=0;j<=k;j++)
    35         if(dp[pre][j]&&j+cnt[rd[i]]<=k&&n-j-cnt[rd[i]]<=k)
    36             ans=min(ans,1LL*(j+cnt[rd[i]])*ls[rd[i]]+1LL*(n-j-cnt[rd[i]])*n);
    37         for(int j=0;j<=k;j++)
    38         {
    39             dp[now][j]|=dp[pre][j];
    40             if(j+cnt[rd[i]]<=k)
    41                dp[now][j+cnt[rd[i]]]|=dp[pre][j];
    42             dp[pre][j]=0;
    43         }
    44         swap(now,pre);
    45     }
    46     if(ans==2e18) printf("-1
    ");
    47     else printf("%lld
    ",ans);
    48     return 0;
    49 }
  • 相关阅读:
    linux下将可执行程序进行打包
    多节点OpenMPI集群的搭建和使用
    快排
    git 出现:warning: LF will be replaced by CRLF in
    String 根据 第一个逗号去掉逗好后面的内容
    SpringBoot项目中想去掉数据库查询到的数组双括号
    mybatis-plus多条件 or 的使用
    从linux上的docker持久化mysql数据恢复到本地mysql数据库
    @Repository和@Mapper
    JavaScript动画实例:爆裂的粒子
  • 原文地址:https://www.cnblogs.com/weeping/p/7292003.html
Copyright © 2011-2022 走看看