【流浪地球——休眠仓】题解

题目背景

地球要在星际中流浪,休眠仓一定要配备的。

因为人的寿命是有限的,而地球移动速度又不能超过光速,那么进行星际旅行的时候,几百上千年的岁月显然是熬不过去,于是就需要休眠仓来把人的寿命冻结,等到条件合适的时候再通过技术手段唤醒他们。

题目描述

某个星际舰队设计了一个特殊的休眠仓,其功能强过所有普通休眠仓。但这个休眠仓只能容下两个总长度不超过S(1≤S≤1000000)的人使用。

这个舰队共有N(2≤N≤200000)个工作人员,分别按1~N顺序编号,编号为i的工作人员的长度为Li(1≤Li≤1000000)。如果两个工作人员的总长度不超过S,那么他们就能进入休眠仓进行休眠。

现在我们想知道,如果选择两个不同的工作人员来使用这个休眠仓,一共有多少种满足条件的方案。

输入格式

第1行是2个整数N和S。

第2~N+l行每行一个整数Li。

输出格式

输出1个整数,表示可选择的所有方案总数。

注意:两个工作人员仅顺序不同的两种方案是被视为同一个方案。

比如:1、2 和2、1是一种选择方案。

输入输出样例

输入 #1 复制

4 6
3
5
2
1

输出 #1 复制

4

说明/提示
【样例说明】

4种选择分别为: 1号和3号;l号和4号;2号和4号;3号4号。

#include
using namespace std;
int j,n,s,a,num;
int len[20002];
int read()
{
    int i=0,f=1;
    char ch;
    for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
    if(ch=='-')
    {
        f=-1;
        ch=getchar();
    }
    for(;isdigit(ch);ch=getchar())
      i=(i<<3)+(i<<1)+ch-'0';
    return i*f;
}
bool comp(const int &a,const int &b)
{
	return a>b; 
}
int find(int low,int high)
{
	int mid,data;
	data=len[low-1];
	while(low<=high)
	{
		mid=(low+high)>>1;
		if(len[mid]+data<=s) high=mid-1;
		else low++;
	}
	return low;
}
int main()
{
	n=read();s=read();
	for(int i=1;i<=n;i++) len[i]=read();
	sort(len+1,len+1+n,comp);
	int sum=0;
	a=1;
	while(len[a]>=s) a++;
	for(int i=a;i<=n-1;i++)
	{
		j=find(i+1,n);
		sum+=(n-j+1);
	}
	cout<<sum<<endl;
	return 0;
}

你可能感兴趣的:(例题题解)