zoukankan      html  css  js  c++  java
  • 组合数 序列

      

    问题 B: 序列

    时间限制: 1 Sec  内存限制: 256 MB

    题目描述

    输入

    5 3

    2 4 2 3 4

    输出

    39

    提示

       因为求的是子序列,不要求连续,所以点在集合里是可以随便选的,只要求出随便选的点的中的最大值即可。

       好麻烦。。换个思路,枚举最大值,找有多少个区间满足它最大,乘上就是它对答案的贡献。

        正解get 考试时1A。

        找区间直接用组合数就行了。最大就500万,打个表就行了。

        

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    #define mod 1000000007
    using namespace std;
    int n,k,a[100005];
    ll ans=0,c[100005][55];
    void init()
    {
    	for(int i=0;i<=n;i++)
    	   for(int j=min(k+2,i);j>=0;j--)
    	      if(i==0||j==i||j==0)c[i][j]=1;
    	      else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
    }
    int main()
    {
    	cin>>n>>k;
    	init();
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        for(int i=k;i<=n;i++)ans=(ans+(a[i]*c[i-1][k-1])%mod)%mod;
        cout<<ans;
    }

  • 相关阅读:
    中间件
    进程的概念
    操作系统必会
    粘包现象及处理方式
    双下方法
    异常处理
    网络编程基础
    osi七层协议
    面向对象初识
    Django 中间件
  • 原文地址:https://www.cnblogs.com/QTY2001/p/7632711.html
Copyright © 2011-2022 走看看