• BestCoder Round #71 (div.2)


    数学 1001 KK's Steel

    类似斐波那契求和

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <map>
    #include <queue>
    
    typedef long long ll;
    const int N = 1e5 + 5;
    const int MOD = 1e9 + 7;
    
    ll run(ll n)    {
        ll a = 1, b = 2, c;
        ll sum = 3, ret = 2;
        while (sum < n) {
            c = a + b;
            if (sum + c < n)    {
                sum += c;
                a = b;  b = c;
                ret++;
            }
            if (sum + c > n)    return ret;
            if (sum + c == n)  return ret + 1;
        }
        return ret;
    }
    
    int main(void)  {
        int T;  scanf ("%d", &T);
        while (T--) {
            ll n;   scanf ("%I64d", &n);
            if (n <= 2) puts ("1");
            else    {
                ll ans = run (n);
                printf ("%I64d
    ", ans);
            }
        }
    
        return 0;
    }
    

    数学 1002 KK's Point

    圆上四个点连线能成圆内一个点,所以答案就是comb (n, 4) + n

    #include <cstdio>
    
    int main(void)  {
        int T;  scanf ("%d", &T);
        while (T--) {
            int n;  scanf ("%d", &n);
            if (n < 4)  printf ("%d
    ", n);
            else    {
                unsigned long long ans = 1;
                ans = ans * n * (n - 1) / 2 * (n - 2) / 3 * (n - 3) / 4 + n;
                printf ("%I64d
    ", ans);
            }
        }
    
        return 0;
    }
    

    还有自己想出来的结论

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <map>
    #include <queue>
    
    typedef long long ll;
    const int N = 1e5 + 5;
    const int MOD = 1e9 + 7;
    
    ll fun(int x)   {
        return 1ll * (1 + x) * x / 2;
    }
    
    int main(void)  {
        int T;  scanf ("%d", &T);
        while (T--) {
            int n;  scanf ("%d", &n);
            ll ans = n;
            n -= 3;
            int t = 1;
            while (n >= 1)  {
                ans += fun (n) * t;
                n--;    t++;
            }
            printf ("%I64d
    ", ans);
        }
    
        return 0;
    }
    

    DP 1004 KK's Number

    显然,每个人的策略就是都会拿剩下的数中最大的某几个数

    假如我们用f[i]表示当剩下i个数的时候先手得分-后手得分的最小值

    那么得到f[i]=maxleft(a[j+1]-f[j] ight)(1<jleq i)f[i]=max(a[j+1]f[j])(1<ji)

    但是这样做,是要超时的

    我们不妨简单转换一下 f[i]=_max; _max=max(_max,a[i+1]-f[i]);

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <map>
    #include <queue>
    
    typedef long long ll;
    const int N = 5e4 + 5;
    const int MOD = 1e9 + 7;
    int a[N];
    long long dp[N];
    
    int main(void)  {
        int T;  scanf ("%d", &T);
        while (T--) {
            int n;  scanf ("%d", &n);
            for (int i=0; i<n; ++i) scanf ("%d", &a[i]);
            std::sort (a, a+n);
            dp[0] = a[0];
            for (int i=1; i<n; ++i) {
                dp[i] = std::max (dp[i-1], a[i] - dp[i-1]);
            }
            printf ("%I64d
    ", dp[n-1]);
        }
    
        return 0;
    }
    

      

    编译人生,运行世界!
  • 相关阅读:
    笔记
    创建和使用URL访问网上资源
    File
    event_1:事件注册
    3_3:创建 元素节点
    动态创建表格
    留言删除案例
    3_2:操作节点 [ 增 删 复制 ]
    5:to do list
    仿新浪下拉菜单
  • 原文地址:https://www.cnblogs.com/Running-Time/p/5196503.html
Copyright © 2020-2023  润新知