【题解】化装晚会

题目描述

        万圣节又到了!Farmer John打算带他的奶牛去参加一个化装晚会,但是,FJ只做了一套能容下两头总长不超过S(1≤S≤1000000)的牛的恐怖服装。FJ养了N(2≤N≤20000)头按1-N顺序编号的奶牛,编号为i的奶牛的长度为L_i(1≤L_i≤1000000)。如果两头奶牛的总长度不超过S,那么她们就能穿下这套服装。

        FJ想知道,如果他想选择两头不同的奶牛来穿这套衣服,一共有多少种满足条件的方案。

输入输出格式

输入格式

        第一行,两个整数,N和S;

        第二至N+1行,每行一个整数:L_i。

输出格式

        一行,输出一个整数,表示FJ可选择的所有方案数。注意奶牛顺序不同的两种方案是被视为相同的。

输入输出样例

输入样例

4 6

3

5

2

1

输出样例

4

题解

       表面上看起来要二分,但是其实暴力枚举即可。

#include <iostream>
#include <cstdio>

#define MAX_N 20000

int n, s;
int a[MAX_N + 5], b[MAX_N + 5];
int ans;

void Sort(int lt, int rt)
{
    if(lt == rt) return;
    int mid = lt + rt >> 1;
    Sort(lt, mid);
    Sort(mid + 1, rt);
    int i = lt, j = mid + 1;
    int cnt = 0;
    while(i <= mid && j <= rt)
    {
        if(a[i] <= a[j]) b[++cnt] = a[i++];
        else b[++cnt] = a[j++];
    }
    while(i <= mid)
    {
        b[++cnt] = a[i++];
    } 
    while(j <= rt)
    {
        b[++cnt] = a[j++];
    }
    for(register int i = 1; i <= cnt; ++i)
    {
        a[lt + i - 1] = b[i]; 
    }
    return;
}

int main()
{
    scanf("%d%d", &n, &s);
    for(register int i = 1; i <= n; ++i)
    {
        scanf("%d", a + i);
    }
    Sort(1, n);
    int lt = 1, rt = n; 
    while(lt < rt)
    {
        while(lt < rt && a[lt] + a[rt] > s) --rt;
        if(lt >= rt) break;
        ans += rt - lt;
        ++lt;
    }
    printf("%d", ans);
    return 0;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10587425.html