NC22604. 小A与任务
描述
输入描述
第一行一个整数 n ,表示小A的任务数量
接下来n行,每行三个整数,分别表示
输出描述
一行一个实数,表示小A最少需要花费的金币数,四舍五入保留一位小数
示例1
输入:
5 1 1 2 1 1 3 1 2 4 1 1 4 1 2 5
输出:
2.0
说明:
在1时刻完成第一个任务,2时刻完成第二个任务,4时刻完成第三个任务,花费1金币在4时刻完成第四个任务,花费1金币在5时刻完成第五个任务C++(g++ 7.5.0) 解法, 执行用时: 231ms, 内存消耗: 2872K, 提交时间: 2022-11-23 15:43:38
#include<bits/stdc++.h> using namespace std; const int N=1e6+100; struct node{ int z,x,y; bool operator < (const node &b)const { return z<b.z; } }e[N]; bool cmp(node a,node b) { return a.y<b.y; } signed main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>e[i].z>>e[i].x>>e[i].y; sort(e+1,e+n+1,cmp); priority_queue<node>q; double ans=0; int res=0; for(int i=1;i<=n;i++) { q.push(e[i]); res+=e[i].x; while(res>e[i].y) { auto no=q.top();q.pop(); int t=min(res-e[i].y,no.x); res-=t; ans+=(double)t/no.z; no.x-=t; if(no.x) q.push(no); } } printf("%.1f\n",ans); return 0; }
C++ 解法, 执行用时: 234ms, 内存消耗: 2916K, 提交时间: 2022-06-12 16:55:01
#include<bits/stdc++.h> using namespace std; struct node{ int x,y,z;//x代表任务时间 y代表截止时间 z代表花费参数 bool operator < (const node&n)const{ return z<n.z; } }a[200010]; bool cmp(node n1,node n2){ return n1.y<n2.y; } priority_queue<node>q; int main(){ int n; cin>>n; for(int i=1;i<=n;i++)cin>>a[i].z>>a[i].x>>a[i].y; sort(a+1,a+1+n,cmp); int time=0; double ans=0; for(int i=1;i<=n;i++){ q.push(a[i]); time+=a[i].x; while(a[i].y<time){ node p=q.top(); q.pop(); int temp=min(time-a[i].y,p.x); time-=temp; ans+=temp*1.0/p.z; p.x-=temp; if(p.x)q.push(p); } } printf("%.1lf\n",ans); }