每个人有两个数字a和b,选择其中一个再组成一个大小为n的序列,问其中最大值*p%最多能大于多少个人
可以尺取,也可优先队列
这个是学姐的代码,优先队列写的。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f;
typedef long long ll;
const int N=2e5+100;
int t,n,xi,ans;
ll p,a[N],maxx;
struct node{
ll v;
int id;
node(){}
node(ll v,int id):v(v),id(id){}
friend bool operator <(const node &a,const node &b){
return a.v<b.v;
}
};
priority_queue<node> q1;
priority_queue<ll> q2;
int main()
{
scanf("%d",&t);
for(int ca=1;ca<=t;++ca){
ans=1;
while(!q1.empty())q1.pop();
while(!q2.empty())q2.pop();
scanf("%d%lld",&n,&p);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
q1.push(node(a[i],i));
q2.push(a[i]);
scanf("%lld",&a[i]);
}
while(!q1.empty()){
maxx=q1.top().v;
while(!q2.empty()&&q2.top()*100>=maxx*p){
q2.pop();
}
// cout<<q2.size()<<endl;
ans=max(ans,n-(int)q2.size());
xi=q1.top().id;
if(a[xi]==0)break;
q1.pop();
q1.push(node{a[xi],xi});
q2.push(a[xi]);
a[xi]=0;
}
printf("Case #%d: %lld\n",ca,ans);
}
return 0;
}
/*
2
5 60
8 5
9 3
14 2
10 8
7 6
*/