CF 222D Olympiad 双指针

来源:互联网 发布:淘宝上有高仿手表买么 编辑:程序博客网 时间:2024/05/16 17:57

题目链接:这里
题意:第一行给出两个个数字k和n,第二三行分别有k个数字,求将第二、三行之间的数字相互组合,求最多有多少个组合的和不小于n
解法:将两行数字分别排序,用双端指针分别从头和尾查找最多有多少组合。
代码:

//CF 222D#include <bits/stdc++.h>using namespace std;const int maxn = 1e5+7;int n, x, a[maxn], b[maxn], c[maxn];int main(){    scanf("%d%d", &n, &x);    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);    for(int i = 1; i <= n; i++) scanf("%d", &b[i]);    sort(a+1, a+n+1);    sort(b+1, b+n+1);    int cnt = n, ans = 0;    for(int i = 1; i <= n; i++){        if(a[i] + b[cnt] >= x) cnt--;    }    ans = n - cnt;    cnt = n;    for(int i = 1; i <= n; i++){        if(a[cnt] + b[i] >= x) cnt--;    }    ans = max(ans, n - cnt);    printf("1 %d\n", ans);    return 0;}
0 0
原创粉丝点击