1 //贪心+优先队列(二叉堆)
2 #include<iostream>
3 #include<cstdio>
4 #include<queue>
5 #include<algorithm>
6 using namespace std;
7 const int N=1000050;
8 #define val first
9 #define dis second
10 int T,n,l,s,ans,now;
11 typedef pair<int,int> p;
12 inline bool cmp(const p &a,const p &b){
13 return a.dis<b.dis;
14 }
15 p a[N];
16 priority_queue<int> q;//大根堆
17 int main(){
18 scanf("%d",&T);
19 while(T--){
20 ans=now=0;//每次清空答案
21 scanf("%d",&n);
22 for(int i=1;i<=n;++i) scanf("%d%d",&a[i].dis,&a[i].val);
23 scanf("%d%d",&l,&s);
24 for(int i=1;i<=n;++i) a[i].dis=l-a[i].dis;//处理所有距离方便计算
25 sort(a+1,a+1+n,cmp);//把每个点按离起点的距离排序
26 while(!q.empty()) q.pop();//清空二叉堆
27 a[++n].dis=l;//把终点当做最后一个点 避免最后再判断
28 for(int i=1;i<=n;++i){
29 int d=a[i].dis-now;//当前位置到下一个点的距离
30 while(s<d){//若油不够
31 if(q.empty()) {ans=-1;goto Nex;}//以前加不到足够的油则无解
32 s+=q.top();q.pop();++ans;//从以前经过的点加最多的油
33 }
34 s-=d;now=a[i].dis;//更新现在油量和所在位置
35 q.push(a[i].val);//把到达点的油量塞进堆里备用
36 }
37 Nex:
38 printf("%d\n",ans);
39 }
40 return 0;
41 }