2 solutions
-
1
模拟()
- 算法分析,每次来一个接水的同学,我们找到最小的水龙头编号,然后让当前人去接,所有人都接水以后,我们去寻找最后一个流完水的水龙头。
#include<bits/stdc++.h> using namespace std; const int M=110; int s[M]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { int x; cin>>x;//第i个同学来接水 int minid; for(int j=1;j<=m;j++) //找到最小的水龙头所在的位置 { if(j==1||s[j]<s[minid]) { minid=j; } } s[minid]+=x; //第i个同学到最小的水龙头的位置 } int maxv=0; for(int i=1;i<=m;i++) //所有同学都接水以后,找到最大的水龙头的流水时间 { if(i==1||s[i]>maxv) { maxv=s[i]; } } cout<<maxv; return 0; }
优化()
由于涉及到找最小值,我们可以使用堆将每次查找的时间从 优化到
#include<bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n>>m; priority_queue<int,vector<int>,greater<int> > q; //小根堆 for(int i=1;i<=n;i++) { int x; cin>>x; if(q.size()<m) //前m个人,直接接水 { q.push(x); } else { q.push(q.top()+x); //到前这个人到最快接完水的水龙头 q.pop(); //删除最小的 } } while(q.size()>1) q.pop(); //只保留最大的 cout<<q.top(); return 0; }
- 1
Information
- ID
- 430
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 10
- Tags
- # Submissions
- 4
- Accepted
- 3
- Uploaded By