[usaco08jan]化装晚会
描述 Description
万圣节又到了!Farmer John打算带他的奶牛去参加一个化装晚会,但是,
FJ只做了一套能容下两头总长不超过S(1 <= S <= 1,000,000)的牛的恐怖服装。
FJ养了N(2 <= N <= 20,000)头按1…N顺序编号的奶牛,编号为i的奶牛的长度为
L_i(1 <= L_i <= 1,000,000)。如果两头奶牛的总长度不超过S,那么她们就能
穿下这套服装。
FJ想知道,如果他想选择两头不同的奶牛来穿这套衣服,一共有多少种满足
条件的方案。
输入格式 Input Format
-
第1行: 2个用空格隔开的整数:N 和 S
-
第2…N+1行: 第i+1为1个整数:L_i
输出格式 Output Format
- 第1行: 输出1个整数,表示FJ可选择的所有方案数。注意奶牛顺序不同的两种
方案是被视为相同的
样例输入 Sample Input
4 6
3
5
2
1
样例输出 Sample Output
4
时间限制 Time Limitation
1s
注释 Hint
输出说明:
4种选择分别为:奶牛1和奶牛3;奶牛1和奶牛4;奶牛2和奶牛4;奶牛3和
奶牛4。
来源 Source
usaco 2008 jan
这道题有一个很显然的暴力
n
2
n^2
n2模拟,我们发现对于一对牛,(a,b)我们在比较a牛与其他牛能否套进服装的时候其实也得出了其他牛能否与a牛进套装,于是我们每次查询的i时候只需要询问i+1到n,0到i之前的信息已经的出来了
即使这样他也看起来也是一个加了剪枝的暴力,于是我抱着测数据的心态交了一下,然后就A了,就A了…
有一组刚好卡过去1000ms…
C o d e Code Code
#include<bits/stdc++.h>
#define MAXN 2000010
using namespace std;
int n, s;
int a[MAXN];
int ans = 0;
int main()
{
scanf("%d%d", &n, &s);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
}
for(int i = 1; i <= n; ++i){
for(int j = i + 1; j <= n; ++j){
if(a[i] + a[j] <= s) ++ ans;
}
}
printf("%d\n", ans);
return 0;
}