CodeForces 222D Olympiad

来源:互联网 发布:环绕音乐软件 编辑:程序博客网 时间:2024/05/16 07:23

题意:第一行给出两个个数字k和n,第二三行分别有k个数字,求将第二、三行之间的数字相互组合,求最多有多少个组合的和不小于n

链接:http://codeforces.com/problemset/problem/222/D

思路:将两行数字分别排序,用双端指针分别从头和尾查找最多有多少组合。

注意点:无


以下为AC代码:

#AuthorProblemLangVerdictTimeMemorySentJudged9709097Practice:
luminous11222D -47GNU C++11Accepted310 ms776 KB2015-02-04 08:55:582015-02-04 08:55:58

#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <vector>#include <deque>#include <list>#include <cctype>#include <algorithm>#include <climits>#include <queue>#include <stack>#include <cmath>#include <map>#include <set>#include <iomanip>#include <cstdlib>#include <ctime>#define ll long long#define ull unsigned long long#define all(x) (x).begin(), (x).end()#define clr(a, v) memset( a , v , sizeof(a) )#define pb push_back#define mp make_pair#define read(f) freopen(f, "r", stdin)#define write(f) freopen(f, "w", stdout)using namespace std;const double pi = acos(-1);int main(){    ios::sync_with_stdio( false );    int n;    int x;    int a[100005] = { 0 };    int b[100005] = { 0 };    while ( cin >> n >> x ){        clr ( a, 0 );        clr ( b, 0 );        for ( int i = 0; i < n; i ++ ){            cin >> a[i];        }        for ( int i = 0; i < n; i ++ ){            cin >> b[i];        }        sort ( a, a + n );        sort ( b, b + n );        int cnt = n - 1;        int ans = 0;        for ( int i = 0 ; i < n; i ++ ){            if ( a[i] + b[cnt] >= x ){                cnt --;            }        }        ans = n - 1 - cnt;        //cout << cnt << endl;        cnt = n - 1;        for ( int i = 0; i < n; i ++ ){            if ( b[i] + a[cnt] >= x ){                cnt --;            }        }        ans = max ( ans, n - cnt - 1 );        cout << "1 " << ans << endl;    }    return 0;}


0 0
原创粉丝点击