新食堂的早餐搭配 (二分做法)
Posted JunMain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新食堂的早餐搭配 (二分做法)相关的知识,希望对你有一定的参考价值。
题目描述
新食堂的早餐搭配: 阿明在一食堂选择早餐,他的想法是选择一份主食和一款饮 料,且花费不超过 x 元。
一维整型数组 main 中记录了每种 主食的价格,一维整型数组 drinks 中记录了每种饮料的价 格。
请问针对不同的预设参数,共有多少种购买方案。
输入格式
第一行输入 n , m n, m n,m(表示主食饮料种类), cost(总预算)
第二行输入每个主食价格
第三行输入每个饮料价格
输出格式
输出选择一份主食和一款饮 料,且花费不超过 cost 元,的总方案数
数据范围
0 ≤ m , n ≤ 1 0 5 0\\leq m,n \\leq 10^5 0≤m,n≤105
样例
输入:
3 3 15
10 20 5
5 5 2
输出:
6
-----------------------------
输入:
3 4 18
3 13 4
6 4 12 10
输出:
9
-----------------------------
输入:
3 4 18
3 7 4
6 4 12 10
输出:
11
暴力 O ( n ∗ m ) O(n*m) O(n∗m)
n, m 为 1 0 5 10^5 105时已经超时
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
int food[N], drink[N];
LL ans;
int main()
{
int n, m, cost;
cin >> n >> m >> cost;
for (int i = 1; i <= n; i ++) cin >> food[i];
for (int i = 1; i <= m; i ++ ) cin >> drink[i];
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++ )
if (food[i] + drink[j] <= cost) ans ++;
cout << ans;
return 0;
}
二分 O ( n l o g m ) O(nlog_m) O(nlogm)
先数组排序 O ( l o g m ) O(log_m) O(logm),
然后让枚举一次层循环n, f o o d [ n ] + d r i n k [ m ] ≤ c o s t food[n] + drink[m] \\leq cost food[n]+drink[m]≤cost 进行二分边界答案
总共的时间复杂度 O ( n l o g m ) O(nlog_m) O(nlogm)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
int food[N], drink[N];
int n, m, cost;
LL ans;
void binary(int x)
{
int l = 1, r = m;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (food[x] + drink[mid] <= cost) l = mid;
else r = mid - 1;
}
ans += l;
}
int main()
{
cin >> n >> m >> cost;
for (int i = 1; i <= n; i ++) cin >> food[i];
for (int i = 1; i <= m; i ++ ) cin >> drink[i];
sort(drink+1,drink+m+1);
for (int i = 1; i <= n; i ++)
binary(i);
cout << ans;
return 0;
}
以上是关于新食堂的早餐搭配 (二分做法)的主要内容,如果未能解决你的问题,请参考以下文章