Codeforces Round #324 (Div. 2) C (二分)

时间:2023-03-08 23:06:41
Codeforces Round #324 (Div. 2) C (二分)

题目链接:http://codeforces.com/contest/734/problem/C

题意:

玩一个游戏,一开始升一级需要t秒时间,现在有a, b两种魔法,两种魔法分别有m1, m2种效果;

对应使用a1[i]魔法需要a2[i]金币,使用b1[i]魔法需要b2[i]金币;

每种魔法最多只能使用一次,问升到n(n<=1e+5)级最少需要多少时间;

注意:给出的b1, b2数组是升序排列的;

思路:对每一个a魔法找到最大的b1魔法jj, 即为使用此a魔法需要最少时间的情况;再找到所有jj中最小的即为答案;

因为b数组是排好序的,所以对于b数组的查找我们可以用二分;时间复杂度为nlog(n);

代码:

 #include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#define ll long long
#define MAXN 200009
using namespace std; ll min(ll a, ll b){
return a<b?a:b;
} int main(void){
int m1, m2;
ll aim, t, money, ans, a1[MAXN], a2[MAXN], b1[MAXN], b2[MAXN];
scanf("%lld%d%d%lld%lld", &aim, &m1, &m2, &t, &money);
for(int i=; i<m1; i++){
scanf("%lld", &a1[i]);
}
for(int i=; i<m1; i++){
scanf("%lld", &a2[i]);
}
for(int i=; i<m2; i++){
scanf("%lld", &b1[i]);
}
for(int i=; i<m2; i++){
scanf("%lld", &b2[i]);
}
ans=t*aim;
for(int i=; i<m1; i++){
ll gg=aim, mm=money;
if(a2[i]<=mm&&a1[i]<t){
ll tt=a1[i];
mm-=a2[i];
int pos=upper_bound(b2, b2+m2, mm)-b2;
if(pos>=m2){
gg-=b1[m2-];
}else if(pos>){
gg-=b1[pos-];
}
ll jj=gg*tt;
ans=min(ans, jj);
}
{
ll gg1=aim;
int pos=upper_bound(b2, b2+m2, money)-b2;
if(pos>=m2){
gg1-=b1[m2-];
}else if(pos>){
gg1-=b1[pos-];
}
ll jj=gg1*t;
ans=min(ans, jj);
}
}
printf("%lld\n", ans);
return ;
}