每个人有两个数字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 */