上海理工大学第二届“联想杯”全国程序设计邀请赛题解
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 \\(\\leq\\)l\\(\\leq\\)r\\(\\leq\\)n
- 所有的\\(h_i\\)(1 \\(\\leq\\) i \\(\\leq\\) l) 是非严格单调递增
- 所有的\\(h_i\\)(r \\(\\leq\\) i \\(\\leq\\) n)非严格单调递减
- 所有的\\(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(矩阵快速幂)
2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码