Planning CodeForces - 854C
题意:有n架航班,第i架原先的时候是在第i分钟起飞的。现在前k分钟无法有飞机起飞,因此需要调整安排表,延后飞机起飞。仍然要求每一分钟只有一架飞机起飞。第i架飞机延误一分钟需要损失ci的钱。不能使飞机起飞的时间早于原先安排中起飞的时间。求如何安排新安排表使损失钱数最少。
方法:
显然,如果在第i分钟有一些飞机延误,那么一架飞机的c值越大,这一分钟产生的损失也越大,而使这一分钟产生的损失尽可能的小并不会导致接下来时间产生的损失增大。因此应当每一分钟都找出要飞的飞机中c值最大的飞走。而举个例子,第k+1分钟有1~k+1架飞机可以飞,第二分钟可以飞的飞机多了一个第k+2架,少了一个第一分钟飞走的。
说白了就是第i分钟,应该从1~i架航班中未飞出的航班中选出ci最大的飞走.
由于需要将数据放入某结构、找出结构中最大值、去掉结构中最大值,可以考虑使用优先队列。
1 #include<cstdio> 2 #include<queue> 3 using namespace std; 4 typedef long long LL; 5 struct Flight 6 { 7 LL c,num; 8 bool operator<(const Flight& b) const 9 { 10 return c<b.c; 11 } 12 }c[300100],t; 13 LL n,k,ans; 14 LL ans2[300100]; 15 priority_queue<Flight> q; 16 int main() 17 { 18 LL i; 19 scanf("%I64d%I64d",&n,&k); 20 for(i=1;i<=n;i++) 21 { 22 scanf("%I64d",&c[i].c); 23 c[i].num=i; 24 } 25 for(i=1;i<=k;i++) 26 q.push(c[i]); 27 for(i=k+1;i<=k+n;i++) 28 { 29 if(i<=n) q.push(c[i]); 30 t=q.top(); 31 q.pop(); 32 ans+=t.c*(i-t.num); 33 ans2[t.num]=i; 34 } 35 printf("%I64d\n",ans); 36 for(i=1;i<=n;i++) 37 printf("%I64d ",ans2[i]); 38 return 0; 39 }