C. The Delivery Dilemma


time limit per test

2 seconds



memory limit per test

256 megabytes



input

standard input



output

standard output



Petya is preparing for his birthday. He decided that there would be nn.


Output


For each test case output one integer — the minimum time after which all dishes can be at Petya's home.


Example


Copy


4 4 3 7 4 5 2 1 2 4 4 1 2 3 4 3 3 3 3 2 1 2 10 10 2 10 10 1 2


Copy


5 3 2 3


**题意:**就是给出你t次,每一次有n这快递,你有两种选择
1. 邮过来,每个需要ai时间,
2. 你自己去取每个需要bi时间

问你最短用多长时间取完这n个快递。
**思路:**模拟,贪心。
首先我们能弄明白,部分去取,剩下都邮过来那些用的是时间就是邮过来用的时间最长的时间。也就是max(ai);所以我们直接对ai进行一次排序,从大到小,这样前的要是邮的话,后面的就不用管了,然后再看我们去取的那部分,这部分需要我们求和。所以我们就需要比较 这个求和之后的时间和邮过来时间做比较。具体看下代码吧。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
struct node {
ll a,b;
}q[maxn];
bool cmp(node a,node b){
return a.a>b.a;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
ll sum=0;
bool flag=0;
for(int i=1;i<=n;i++) scanf("%lld",&q[i].a);
for(int i=1;i<=n;i++) scanf("%lld",&q[i].b);
sort(q+1,q+1+n,cmp);
for(int i=1;i<=n;i++){
if(sum>=q[i].a){
printf("%lld\n",sum);
flag=1;
break;
}
if(q[i].a>=q[i].b){
sum+=q[i].b;
}else {///如果取餐的代价比快递还大肯定直接输出快递这个
printf("%lld\n",q[i].a);
flag=1;
break;
}
if(sum>=q[i].a){///判断取完这个餐与快递这个餐那个更好
printf("%lld\n",q[i].a);
flag=1;
break;
}
}
if(!flag)printf("%lld\n",sum);
}
return 0;
}