Problem B:化装晚会(usaco月赛)
Time Limit:1000MS Memory Limit:65536K
Total Submit:162 Accepted:104
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
输入文件的第1行是 2个用空格隔开的整数:N 和 S, 第2..N+1行每行一个整数:L_i
Output
1行: 输出1个整数,表示FJ可选择的所有方案数。注意奶牛顺序不同的两种方案是被视为相同的
Sample Input
4 6
3
5
2
1
Sample Output
4
输出说明:
4种选择分别为:奶牛1和奶牛3;奶牛1和奶牛4;奶牛2和奶牛4;奶牛3和
奶牛4。
#include<cstdio> #include<algorithm> using namespace std; long long a[20010],s,n; long long check(int b,int c) { int low = b,hi = n+1; while(low+1 < hi) { int mid =(low + hi)/2; if(a[mid] <= c) low = mid; else hi = mid; } return low - b; } int main() { long long i,ans=0,k;//ans ???? scanf("%d%d",&n,&s);//n ?????? s?? ???????? for(i=1;i<=n;i++) { scanf("%d",&a[i]); } sort(a+1,a+n+1); a[0]=-1; a[n+1]=1000001; for(i=1;i<=n;i++) { k=a[i]; ans=ans+check(i,s-a[i]); } printf("%d",ans); return 0; }
这道题目算是指针型的二分查找