• 茅台【思维/数学/剪枝】By cellur925


    题目传送门

    给你(n)根木棍,问有多少种方法,使得选出的三根木棍能组成三角形。

    开始想要用搜索的,但是写着写着卡壳了(?),于是改用贪心,开始对拍,觉得很稳,只是最后两个数据可能有点卡。很第一题难度。

    最开始的想法:排序。(O(n^3))枚举一下。

    进阶想法:发现有很多枚举是重复的,加入一个小剪枝,当开头两个数相加大于最大的数,直接加答案。实测速度没快多少。

    最终想法:借鉴上一想法,那么其实可以借助(lowerbound)把复杂度将至(O(n^2logn))

    #include<cstdio>
    #include<algorithm>
    
    using namespace std;
    typedef long long ll;
    
    int n,maxn;
    ll ans;
    int seq[20000];
    
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d",&seq[i]);
    	sort(seq+1,seq+1+n);maxn=seq[n];
    	for(int i=1;i<=n-2;i++)
    		for(int j=i+1;j<=n-1;j++)
    			for(int k=j+1;k<=n;k++)
    			{
    				if(seq[i]+seq[j]<=seq[k]) break;
    				else if(seq[i]+seq[j]>maxn) {ans+=n-k+1;break;}
    				else
    				{
    					int id=lower_bound(seq+1,seq+1+n,seq[i]+seq[j])-seq;
    					ans+=id-k;
    					break;
    				}
    			}
    	printf("%lld
    ",ans);
    	return 0;
    }
    

    因为数据不诚信,最后两个点开到了(10000),所以全机房(80)分。

    (std)的做法:复杂度(O(n^2+n))。这种方法的妙处在于对于每个起点,第二个棍和第三个棍分别共走(O(n))

    #include<cstdio>
    #include<algorithm>
    
    using namespace std;
    typedef long long ll;
    
    int n;
    ll ans;
    int seq[10000];
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&seq[i]); 
        sort(seq+1,seq+1+n);
        for(int i=1;i<=n;i++)
            for(int j=i+1,k=i+2;j<=n;j++)
            {
                while(k<=n&&seq[i]+seq[j]>seq[k]) k++;
                k--;
                ans+=k-j;
            }
        printf("%lld
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    LintCode: Climbing Stairs
    LintCode: Binary Tree Postorder Traversal
    LintCode: Binary Tree Preorder Traversal
    LintCode: Binary Tree Inorder Traversal
    Lintcode: Add Two Numbers
    Lintcode: Add Binary
    LintCode: A + B Problem
    LintCode: Remove Linked List Elements
    LintCode:Fibonacci
    Lintcode开刷
  • 原文地址:https://www.cnblogs.com/nopartyfoucaodong/p/9880859.html
Copyright © 2020-2023  润新知