題解 CF1443C 【The Delivery Dilemma】
阿新 • • 發佈:2020-11-03
題目大意
你需要去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; }