算法分析
本题是一道比较简单的贪心题,本着多练练STL的原则,本文题解用优先队列进行实现。本题值得注意的是,经过分析,我们只需要让不满意的人数尽量少即可,题目要求中,并不关心每一个顾客的不满意程度,所以我们可以“牺牲”一些顾客,来使得尽可能多的顾客满意。
代码及题解
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=100050;
struct per{
int tim; //服务时间
per():tim(0){} //构造函数用于在定义时就清空结构体,增强代码的鲁棒性。
bool operator < (const per& b) const{ //重定义比较运算符
return tim>b.tim;
}
};
priority_queue<per> q;
int n,ans=0;
int c=0; //等待时间
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
cin>>n;
for(int i=0;i<n;i++){
per node;
cin>>node.tim;
q.push(node);
}
while(!q.empty()){
per top=q.top();
if(c<=top.tim){ //注意这里,只有这个人不失望了,才会让他排在队伍里,才会让c增加,如果这个人已经失望了,那就不如直接让他不排队了(或认为将其排到队尾),直接让其失望到底。
ans++;
c+=top.tim;
}
q.pop();
}
cout<<ans;
return 0;
}
作者
Bowen
本文代码及题解均为作者原创,转载请注明出处。
本文作者水平有限,如有纰漏之处,敬请斧正。欢迎大家一起学习交流。