上海理工大学第二届“联想杯”全国程序设计邀请赛题解

Posted 安乐最值钱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了上海理工大学第二届“联想杯”全国程序设计邀请赛题解相关的知识,希望对你有一定的参考价值。

上海理工大学第二届“联想杯”全国程序设计邀请赛

比赛链接

A. A-SOUL!

题意:给出n个数,与公差d。问将n个数重新排列后最长的等差数列的长度是多少。

思路:从小到大排序后用map记录并维护当前数结尾的等差数列长度。

#include<bits/stdc++.h>
#include<sstream>
using namespace std;
#define  mp make_pair
#define REP(i,a,b) for(int i=a;i<b;i++)
typedef  long long LL ;
const int maxn = 1e5+10;

LL arr[maxn];

int main()
{
    memset(arr, 0  ,sizeof arr);
    LL n  ,k;
    cin >> n >> k;
    for(int i=0;i<n;++i)
    {
        cin >> arr[i];
    }
    sort(arr, arr+n);
    map<LL , LL> rec;
    LL ans = 1;
    rec[arr[0]] = 1;
    for(int i=1;i<n;++i)
    {
        LL tem = arr[i];
        rec[tem] = max(1LL, rec[tem]);
        if(rec.count(tem-k))
        {
            rec[tem]  = max(rec[tem]  ,rec[tem-k]+1 );
        }
        ans = max(ans, rec[tem]);
    }
    cout << ans;

}

B. Bheith i ngra le

题意:一个n*m的网格,颜色为白或者黑。我们定义当前网格为好。

1.所有黑色的方格为一个联通块

2.对于每一列所有黑色方格的最下端的方格必须是黑色,且该列所有黑色方格必须相连。

我们定义在列i的最高的黑色方格为\\(h_i\\)。我们定义一个好的网格图为一个山峰,当该网格至少存在一个整数对(l,r)满足

  1. 1 \\(\\leq\\)l\\(\\leq\\)r\\(\\leq\\)n
  2. 所有的\\(h_i\\)(1 \\(\\leq\\) i \\(\\leq\\) l) 是非严格单调递增
  3. 所有的\\(h_i\\)(r \\(\\leq\\) i \\(\\leq\\) n)非严格单调递减
  4. 所有的\\(h_i\\) (l \\(\\leq\\) i \\(\\leq\\) r)相同

输出n*m的网格中总共可以画几座山,结果mod \\(10^9+7\\)

思路:

DP[i][j]= \\(\\sum_{x=1}^n\\)DP[i-1][x] * (n+1-x) // O(\\(n^2\\)*m)

​ = DP[i][j-1] + $$\\sum_{x=1}^j$$ ( DP[i-1][x] * (n+1-x) ) //用前缀和后 O(n*m)

ans = \\(\\sum_{i=1}^n\\)\\(\\sum_{j=1}^m\\) ( DP[i][j] * (n+1-j) ) ;

DP[i][j]为底座宽度为j,高度为i的山的种类。

代码:

#include<bits/stdc++.h>
#include<sstream>
using namespace std;
#define  mp make_pair
#define REP(i,a,b) for(int i=a;i<b;i++)
typedef  long long LL ;
typedef unsigned long long ULL;
typedef pair<int, int> P;
const int maxn = 2e3+10;
const int MOD = 1e9+7;
const int INF = 1e9+7;
const double PI = acos(-1);
const double eps = 1e-7;



LL DP[maxn][maxn];
LL pre[maxn];

void solve()
{
    int n, m;cin >>n >> m;
    memset(pre, 0, sizeof pre);
    LL ans  = 0;
    for(int i=1;i<=m;++i)
    for(int j=1;j<=n;++j)
    {
        if(j==1)
        {
            DP[i][j] = 1;
            pre[j] = 1;
        }
        else
        {
            DP[i][j] = (DP[i][j-1]+pre[j]) % MOD;
            pre[j] = (DP[i][j]+ pre[j-1])%MOD;
        }
        ans  = (ans%MOD  + (DP[i][j] * (n+1-j)) % MOD) % MOD;
    }
    printf("%lld" , (ans+1)%MOD);

}

int main()
{
    ios::sync_with_stdio(false);
    solve();

}

以上是关于上海理工大学第二届“联想杯”全国程序设计邀请赛题解的主要内容,如果未能解决你的问题,请参考以下文章

上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)

上海理工大学第二届“联想杯”全国程序设计邀请赛 - Little Witch Academia(矩阵快速幂)

哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码

2020-2021年度第二届全国大学生算法设计与编程挑战赛(春季赛)部分题题解

2011年全国大学生程序设计邀请赛(福州)