3 条题解
-
1
#include <bits/stdc++.h> using namespace std; struct node { int t;//截止时间 int w;//罚款 }; node a[1005]; int m,n; bool cmp(node x,node y){//按截止时间排序,截止时间大的排前面 return x.t>y.t; } priority_queue<int> q;//优先队列,罚款最大的排前面 int main() { cin>>m>>n; for(int i=1;i<=n;i++){ cin>>a[i].t; } for(int i=1;i<=n;i++){ cin>>a[i].w; } sort(a+1,a+n+1,cmp);//按截止时间排序 int p=1; for(int i=n;i>=1;i--){//枚举从后到前的时间 while(a[p].t>=i&&p<=n){//可以在截止时间内做的都放入优先队列 q.push(a[p].w); p++; } if (!q.empty()){//如果有可以做的,做罚款最大的 q.pop(); } } while (!q.empty()){//所有没做的任务 m-=q.top();//计算罚款 q.pop(); } cout<<m; return 0; }
-
1
#include <bits/stdc++.h> using namespace std; struct node { int t;//截止时间 int w;//罚款 }; node a[1005]; int m,n; bool cmp(node x,node y){//按截止时间排序,截止时间大的排前面 return x.t>y.t; } priority_queue q;//优先队列,罚款最大的排前面 int main() { cin>>m>>n; for(int i=1;i<=n;i++){ cin>>a[i].t; } for(int i=1;i<=n;i++){ cin>>a[i].w; } sort(a+1,a+n+1,cmp);//按截止时间排序 int p=1; for(int i=n;i>=1;i--){//枚举从后到前的时间 while(a[p].t>=i&&p<=n){//可以在截止时间内做的都放入优先队列 q.push(a[p].w); p++; } if (!q.empty()){//如果有可以做的,做罚款最大的 q.pop(); } } while (!q.empty()){//所有没做的任务 m-=q.top();//计算罚款 q.pop(); } cout<<m; return 0; }
-
0
将任务按截止时间排序; 枚举从后到前的时间,当前时间内做罚款最大的任务;
#include <bits/stdc++.h> using namespace std; struct node { int t;//截止时间 int w;//罚款 }; node a[1005]; int m,n; bool cmp(node x,node y){//按截止时间排序,截止时间大的排前面 return x.t>y.t; } priority_queue<int> q;//优先队列,罚款最大的排前面 int main() { cin>>m>>n; for(int i=1;i<=n;i++){ cin>>a[i].t; } for(int i=1;i<=n;i++){ cin>>a[i].w; } sort(a+1,a+n+1,cmp);//按截止时间排序 int p=1; for(int i=n;i>=1;i--){//枚举从后到前的时间 while(a[p].t>=i&&p<=n){//可以在截止时间内做的都放入优先队列 q.push(a[p].w); p++; } if (!q.empty()){//如果有可以做的,做罚款最大的 q.pop(); } } while (!q.empty()){//所有没做的任务 m-=q.top();//计算罚款 q.pop(); } cout<<m; return 0; }
- 1
信息
- ID
- 610
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者