题目描述
万圣节又到了!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; }