zoukankan      html  css  js  c++  java
  • HDU-5720 Wool

    Wool

     
     Accepts: 109
     
     Submissions: 770
     Time Limit: 8000/4000 MS (Java/Others)
     
     Memory Limit: 262144/262144 K (Java/Others)
    问题描述
    黎明时,Venus为Psyche定下了第二个任务。她要渡过河,收集对岸绵羊身上的金羊毛。
    
    那些绵羊狂野不驯,所以Psyche一直往地上丢树枝来把它们吓走。地上现在有nn根树枝,第ii根树枝的长度是a_iai.
    
    如果她丢的下一根树枝可以和某两根树枝形成三角形,绵羊就会被激怒而袭击她。
    
    现在Psyche手中只有长度不小于LL且不大于RR的树枝。请你帮忙计算,她下一根可以丢多少种不同长度的树枝而不会把绵羊激怒呢?
    输入描述
    第一行,一个整数T (1 le T le 10)T(1T10),代表数据组数。
    
    对于每组数据,第一行有三个整数n,L,Rn,L,R (2 le n le 10 ^ 5, 1 le L le R le 10 ^ {18})(2n105,1LR1018)。
    
    第二行,nn个整数,第ii个整数为a_iai (1 le a_i le 10 ^ {18})(1ai1018),代表第ii根树枝的长度。
    输出描述
    输出TT行,对于每组数据,输出选取方式总数。
    输入样例
    2
    2 1 3
    1 1
    4 3 10
    1 1 2 4
    输出样例
    2
    5
    Hint
    对于第一组数据,可以选用长度为2, 32,3的树枝。
    
    对于第二组数据,可以选用长度为6, 7, 8, 9, 106,7,8,9,10的树枝。

    解题思路:

    考虑三角形的判断条件,a + b > c && a - b < c(a >= b)

    那么只需要把未知的那个边当作c这条边,已知的当作a,b两条边

    然后求在[l, r]区间内,不属于(a-b, a+b)的区间里的整数即可


    代码如下:

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    typedef long long LL;
    typedef pair<LL, LL > pi;
    const int maxn = 1e5;
    pi b[maxn];
    LL a[maxn];
    bool cmp(pi x, pi y){
        return (x.first == y.first ? (x.second > y.second) : (x.first < y.first));
    }
    int main()
    {
        // freopen("test.in", "r+", stdin);
        // freopen("test.out", "w+", stdout);
        LL t, n, L, R;
        scanf("%lld", &t);
        while(t--){
            scanf("%lld%lld%lld", &n, &L, &R);
            for(int i = 0; i < n; ++i) scanf("%lld", &a[i]);
            sort(a, a + n);
            for(int i = 0; i < n - 1; ++i){
                b[i].first = a[i+1] - a[i];
                b[i].second = a[i+1] + a[i];
            }
            if(n - 1 >= 2)
                sort(b, b + n - 1, cmp);
            LL ans = 0, tmp1 = L, tmp2 = L;
            for(int i = 0; i < n - 1; ++i){
                if(b[i].second <= L) continue;
                if(b[i].first > R) break;
    
                if(b[i].first >= tmp2){
                    tmp1 = b[i].first;
                    ans += tmp1 - tmp2 + 1;
                }
                if(b[i].second > tmp2){
                    tmp2 = b[i].second;
                }
                if(tmp2 > R){
                    tmp2 = R + 1;
                    break;
                }
            }
            ans += (R >= tmp2 ? (R - tmp2 + 1) : 0 );
            printf("%lld
    ", ans);
        }
        return 0;
    }


  • 相关阅读:
    2020/10/29
    2020/10/24
    2020/10/28
    2020/10/31周报
    linux shell 中判断字符串为空的正确方法
    20201107 千锤百炼软工人
    20201103 千锤百炼软工人
    20201109 千锤百炼软工人
    20201111 千锤百炼软工人
    20201105 千锤百炼软工人
  • 原文地址:https://www.cnblogs.com/wiklvrain/p/8179459.html
Copyright © 2011-2022 走看看