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\n",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\n");
47     else printf("%lld\n",ans);
48     return 0;
49 }

 

posted @ 2017-08-05 23:54  weeping  阅读(450)  评论(0)    收藏  举报