zoukankan      html  css  js  c++  java
  • 51 Nod 2497 数三角形 二分

    小b有一个仅包含非负整数的数组a,她想知道有多少个三元组(i,j,k),满足i<j<k且a[i],a[j],a[k]可能作为某个三角形的三条边的边长。

     

    输入

    第一行输入一个正整数n,表示数组a中元素个数;
    第二行n个非负整数,表示a中元素,以空格隔开;
    其中0<n≤1000,a中任意元素a[i]满足0≤a[i]≤1000。

    输出

    输出一个数,表示满足题意的三元组个数

    输入样例

    4
    2 2 3 4

    输出样例

    3


    很容易想到一个O(n^2 * logn)的解法,我们将原来数组排完序后,枚举两个较小的边,然后二分出最长边的范围即可;
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstdlib>
    #include<set>
    #include<map>
    using namespace std;
    #define maxn 100005
    #define rdint(x) scanf("%d",&x)
    typedef long long ll;
    
    int n;
    int a[1002];
    int main() {
    	rdint(n);
    	for (int i = 1; i <= n; i++)rdint(a[i]);
    	int tot = 0;
    	sort(a + 1, a + 1 + n);
    //	int nn = unique(a + 1, a + 1 + n) - (a + 1);
    	for (int i = 1; i < n; i++) {
    		for (int j = i + 1; j < n; j++) {
    			int l = j + 1;
    			int r = n;
    			int ans1 = -1;
    			while (l <= r) {
    				int mid = (l + r) / 2;
    				if (a[mid] > (a[j] - a[i])) {
    					r = mid - 1; ans1 = mid;
    				}
    				else {
    					l = mid + 1;
    				}
    			}
    			ans1 = upper_bound(a + 1 + j + 1, a + 1 + n, a[j] - a[i]) - (a + 1);
    			l = j + 1; r = n;
    			int ans2 = -1;
    			ans2 = lower_bound(a + 1 + j + 1, a + 1 + n, a[i] + a[j]) - (a + 1);
    //			cout << ans1 << ' ' << ans2 <<' '<< a[i] + a[j] << endl;
    			if (ans1 == -1 || ans2 == -1)continue;
    //			tot += (ans2 - ans1 + 1);
    
    			
    			else if (ans2 == ans1 && a[ans1] > a[i] + a[j]) {
    				tot += 0;
    			}
    			else if (ans2 == ans1 && a[ans2] < a[i] + a[j]) {
    //				cout << 2 << endl;
    				tot += (ans2 - ans1 + 1);
    			}
    			else if (ans2 > ans1 && a[ans2]<a[i]+a[j]) {
    				tot += (ans2 - ans1 + 1);
    			}
    			else if (ans2 > ans1&& a[ans2] >= a[i] + a[j]) {
    				tot += (ans2 - ans1);
    			}
    		}
    	}
    	printf("%d
    ", tot);
    //	system("pause");
    }
    

      

    
    
  • 相关阅读:
    java实现第三届蓝桥杯填算式
    java实现第三届蓝桥杯填算式
    微信--高效解决token及授权用户openid的持久化处理办法
    微信开发学习总结——微信开发入门(转)
    Java 微信公众号开发--- 接入微信
    微信开发工具类
    手把手教你反编译别人的app
    马士兵hadoop第五课:java开发Map/Reduce(转)
    马士兵hadoop第四课:Yarn和Map/Reduce配置启动和原理讲解(转)
    马士兵hadoop第三课:java开发hdfs(转)
  • 原文地址:https://www.cnblogs.com/zxyqzy/p/11116181.html
Copyright © 2011-2022 走看看