zoukankan      html  css  js  c++  java
  • 求值(二分)

    题目描述 

    给定n个数,从中选出三个数,使得最大的那个减最小的那个的值小于等于d,问有多少种选法。

    输入描述:

    第一行两个整数n,d(1 <= n <= 100,000,1 <= d <= 1000,000,000);
    第二行n个整数满足abs(ai) <= 1,000,000,000。数据保证a单调递增。
    

    输出描述:

    输出一个整数表示满足条件的选法。
    示例1

    输入

    4 3
    1 2 3 4

    输出

    4

    简单的二分

    AC:代码

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e5+5;
    ll v[maxn];
    ll f(ll p){
    	ll s = 1;
    	s = p*(p-1)/2;
    	return s;
    }
    int main()
    {
    	ios_base::sync_with_stdio(false);cin.tie(0);
    	ll n,m,sum = 0;
    	cin>>n>>m;
    	for(int i = 0;i<n;i++){
    		cin>>v[i];
    	}
    	for(int i = n-1;i>=0;i--){
    		int low = 0,high = i,mid;
    		while(high>low){
    			mid = low + (high - low)/2;
    			if(m>=(v[i] - v[mid])){
    				high = mid;
    			} else {
    				low = mid + 1;
    			}
    		}
    		if(i - mid >=2){
    			sum = sum + f(i - low); 
    		}
    	}
    	printf("%lld
    ",sum);
    	return 0;
    }


  • 相关阅读:
    链家新房爬虫
    豆瓣电影爬虫
    电影天堂爬虫
    数组、数组和集合的区别
    Profile小试
    SQL中的case when使用小例
    使用AVAudioPlayer播放网络音乐
    播放器
    全排列问题
    由while(scanf("%d",&n)!=EOF)引出的小问题
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11746021.html
Copyright © 2011-2022 走看看