【分治算法】化妆晚会

xiaoxiao2025-09-16  129

题目描述

万圣节又到了!Farmer John打算带他的奶牛去参加一个化装晚会,但是,FJ只做了一套能容下两头总长不超过S(1 < = S < = 1,000,000)的牛的恐怖服装。FJ养了N(2 < = N < = 50,000)头按1…N顺序编号的奶牛,编号为i的奶牛的长度为L_i(1 < = L_i < = 1,000,000)。如果两头奶牛的总长度不超过S,那么她们就能穿下这套服装。 FJ想知道,如果他想选择两头不同的奶牛来穿这套衣服,一共有多少种满足条件的方案。

输入

输入文件的第1行是 2个用空格隔开的整数:N 和 S, 第2…N+1行每行一个整数:L_i

输出

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

输入样例

4 6 3 5 2 1

输出样例

4

说明

输出说明: 4种选择分别为:奶牛1和奶牛3;奶牛1和奶牛4;奶牛2和奶牛4;奶牛3和 奶牛4。 【数据规模】 对于30%的数据,N<=10000; 对于100%的数据,N<=50000

分析

不因为顺序而影响结果,因此排完序后就找到容不下的就break;但是要二分查找

代码

#include<bits/stdc++.h> using namespace std; const int N=200005; int a[N],n,s,ans; int divide_into_two(int now,int contain) { int hand_left=now,hand_right=n+1,mid; while(hand_left+1<hand_right) { mid=(hand_left+hand_right)/2; if(a[mid]<=contain) hand_left=mid; else hand_right=mid; } return hand_left-now; } int main() { scanf("%d%d",&n,&s); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); a[0]=-1; a[n+1]=1e9; for(int i=1;i<=n;i++) ans+=divide_into_two(i,s-a[i]); printf("%d",ans); }
转载请注明原文地址: https://www.6miu.com/read-5036437.html

最新回复(0)