1. 程式人生 > 實用技巧 >題解 CF1443C 【The Delivery Dilemma】

題解 CF1443C 【The Delivery Dilemma】

題目大意

你需要去n個餐廳取菜,你可以選擇自己去取,也可以選擇叫外賣,ai表示第i家餐廳

送到你家所需的實際,bi表示自己去第i家餐廳取菜所需時間,已知餐廳在你離開家

時同時送餐,求取到所有菜的最短時間

思路分析

我們先假設所有菜都送外賣過來,按ai大小對送到的時間由大到小排序,針對當前送

到家的最大時間,如果去餐廳取比送外賣時間短,那麼顯然自己去取更優秀,從大到

小列舉即可,如果在某一道菜時,自己去取的總時間大於送外賣的最大時間,直接輸

出即可

程式碼

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int maxn=2e5+10;
inline int read(){
	int ret=0;
	int f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			f=-f;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		ret=ret*10+(ch^'0');
		ch=getchar();
	}
	return ret*f;
}
int t;
int n;
int b[maxn];
struct node{
	int id;
	int v;
}a[maxn];
bool operator < (const node &x,const node & y){
	return x.v>y.v;
}
signed main(){
//	freopen("a.txt","r",stdin);
	t=read();
	while(t--){
		n=read();
		for(int i=1;i<=n;i++){
			a[i].v=read();
			a[i].id=i;	
		}
		for(int i=1;i<=n;i++){
			b[i]=read();
		}
		sort(a+1,a+1+n);
		int add=0;
		int fla=0;
		for(int i=1;i<=n;i++){
			if(add>=a[i].v){
				cout<<add<<endl;//add比上一道菜小,比當前大,最大值為add,直接輸出 
				fla=1;
				break;
			}
			if(a[i].v>=b[a[i].id])
				add+=b[a[i].id];
			else{
				cout<<a[i].v<<endl;
				fla=1;
				break;
			}
			if(add>=a[i].v){
				cout<<a[i].v<<endl;
				fla=1;
				break;
			}
		}
		if(!fla){
			cout<<add<<endl;//優化失敗,輸出 
		}
	//	memset(b,0,sizeof(b));
	//	memset(a,0,sizeof(a));
	}
	return 0;
}