山东师范大学寒假训练赛1补题
C - C
思想:贪心——在能起飞的每一分钟里从能起飞的飞机中选择当前成本最高的飞机先起飞,方能使最终的成本最低。
运用STL数据结构——优先队列。
需要注意的地方——最终花费开long long,在计算并加每一分钟花费时要将int型的变量转为long long只需*1ll即可。
代码如下:(一次循环,维护一个优先队列)
#include<iostream> #include<queue> using namespace std; struct node { int num; int m; }; bool operator<(node a,node b) { return a.m<b.m; } priority_queue<node> que; int num0[300010]; int main() { int n,k; long long minmo=0; scanf("%d%d",&n,&k); for(int i=1;i<=n+k;i++) { int mo; if(i<=n) { scanf("%d",&mo); que.push({i,mo}); } if(i>=k+1) { minmo+=1ll*que.top().m*(i-que.top().num); num0[que.top().num]=i; que.pop(); } } printf("%lld\n",minmo); for(int i=1;i<=n;i++) { if(i!=n) printf("%d ",num0[i]); else printf("%d",num0[i]); } return 0; }