做网站和app那个花销大/外贸快车
- 博客主页: https://blog.csdn.net/qq_50285142
- 欢迎点赞👍收藏✨关注❤留言 📝 如有错误,敬请指正
- 🎈虽然生活很难,但我们也要一直走下去🎈
A.set+priority_queue
题意:
为了形象,我把题意换成洗衣机了,换汤不换药。
一共有n台洗衣机(0到n-1),m件衣服,规定每件衣服只能用一台洗衣机洗,每件衣服都有一个洗衣的开始时间和洗衣持续的时间,要求编号为i的衣服选择洗衣机时,要从i%n开始选,往后直到选择到空闲洗衣机为止,到末尾再从前往后选择,没有空闲的洗衣机时,这件衣服不洗。洗衣机被占用时不能洗其他衣服,求洗衣次数最多的洗衣机的编号是多少
思路:
使用set+priority_queue
set中存的是空闲洗衣机的标号
priority_queue表示的是时间线,我们按从小到大来排,那么时间小的一定在最前面。存的是正在洗的洗衣机的信息({洗衣机结束洗衣的时间,正在洗衣的洗衣机编号})
1.每次选择一件衣服,如果当前衣服的开始洗的时间大于等于优先队列头位置结束洗衣的时间,说明优先队列头位置的洗衣机已经结束洗衣,就把它弹出,加到set里面。
2.然后开始在set里面寻找空闲洗衣机,二分找大于等于i%n的洗衣机,如果找不到,那么要么在前面(取第一个元素即可),要么没有空闲洗衣机(继续下一件衣服)
3.找到空闲洗衣机时,把set里面去掉该台空闲的洗衣机,优先队列里面加入正在洗衣的洗衣机
最后找最大值输出即可
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
const int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const int N = 1e5+5,M = 2e5+5;int n,m,k;
int res[N];void solve()
{cin>>n>>m;set<int>s;priority_queue<pii,vector<pii>,greater<pii> >q;for(int i=0;i<n;i++)s.insert(i);for(int i=0;i<m;i++){int a,b;cin>>a>>b;while(q.size() and q.top().fi <= a){s.insert(q.top().se);q.pop();}auto it = s.lower_bound(i%n);if(it==s.end()){if(s.empty()) continue;it = s.begin();}int xx = *it;s.erase(xx);q.push({a+b,xx});res[xx]++;}int mx = *max_element(res,res+n);int is = true;for(int i=0;i<n;i++){if(mx==res[i]){if(is) {cout<<i;is = false;}else cout<<" "<<i;}}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int _;// cin>>_;_ = 1;while(_--){solve();}return 0;
}
往期优质文章推荐
- 💛💚STL详解,超全总结(快速入门STL)
- 💛🧡【期末复习】c++知识点大回顾,八篇文章让你永不破防(一)
- 💛💚区间贡献问题习题详解