【CSP-J系列】复赛备考
2026-07-15 19:54:27
发布于:浙江
First round
意思如题,就是说我要做接下来的题嗯对。

这是豆包给我的 道备考CSP-J第二轮的题目,我每写完一道会在这里发题解,如果进程不错的话会考虑再来一轮。
r1.3
在计时。 写了一坨。
#include <iostream>
using namespace std;
int main()
{
int r, dp[1005][1005], a[1005][1005];
cin>>r;
for(int i = 1;i<=r;i++)
{
for(int j = 1;j<=i;j++)
{
cin>>a[i][j];
}
}
for(int i = 1;i<=r;i++)
{
for(int j = 1;j<=i;j++)
{
dp[i][j]=dp[i-1][j-1]+max(dp[i][j-1],dp[i][j]);
}
}
int sum=0;
for(int i = 1;i<=r;i++) sum=max(sum,dp[r][i]);
cout<<sum;
}
调调看。
又是只 A 一个点。
#include <iostream>
using namespace syh;
int main()
{
int r, dp[1005][1005], a[1005][1005];
cin>>r;
for(int i = 1;i<=r;i++)
{
for(int j = 1;j<=i;j++)
{
cin>>a[i][j];
}
}
dp[1][1]=max(a[2][1],a[2][2]);
dp[2][1]=dp[1][1]+max(a[3][1],a[3][2]);
for(int i = 2;i<=r;i++)
{
for(int j = 2;j<=i;j++)
{
dp[i][j]=dp[i-1][j-1]+max(dp[i][j-1],dp[i][j]);
}
}
int sum=0;
for(int i = 1;i<=r;i++) sum=max(sum,dp[r][i]);
cout<<sum;
}
, ,这啥阴。
#include <iostream>
using namespace syh;
int main()
{
int r, dp[1005][1005], a[1005][1005];
cin>>r;
for(int i = 1;i<=r;i++)
{
for(int j = 1;j<=i;j++)
{
cin>>a[i][j];
}
}
for(int i = 1;i<=r;i++)
{
for(int j = 1;j<=i;j++)
{
dp[i][j]=max(a[i][j],a[i][j+1])+dp[i-1][j];
}
}
int sum=0;
for(int i = 1;i<=r;i++) sum=max(sum,dp[r][i]);
cout<<sum;
}
这砂银猪心了, 。
#include <iostream>
using namespace syh;
int r, dp[1005][1005], a[1005][1005];
int main()
{
cin>>r;
for(int i = 1;i<=r;i++)
{
for(int j = 1;j<=i;j++)
{
cin>>a[i][j];
}
}
for(int i = 1;i<=r;i++)
{
for(int j = 1;j<=i;j++)
{
dp[i][j]=max(a[i+1][j],a[i+1][j+1])+dp[i-1][j-1];
}
}
int sum=0;
for(int i = 1;i<=r;i++) sum=max(sum,dp[r][i]);
cout<<sum;
}
我可以说是我耳机里的歌很吵才这样的嘛?
过了。
其实也是dp转移的问题,我一开始想的是对于每个元素的最大值都是它加上下面两个的最大值,所以写错了,后面又加了上面两个元素的最大值,神秘的得到了 ,最后看图才想明白,我菜菜,真的能打J嘛?
题解
通过题目给的图可以看出来,每个元素能达到的最大值为自身的值加上上面的 个元素最大值的最大值,那么我们的dp[i][j]就是max(dp[i-1][j-1],dp[i-1][j])+a[i][j]根据这一条就能写了,简单的线性dp。
#include <iostream>
using namespace syh;
int r, dp[1005][1005], a[1005][1005];
int main()
{
cin>>r;
for(int i = 1;i<=r;i++)
{
for(int j = 1;j<=i;j++)
{
cin>>a[i][j];
}
}
for(int i = 1;i<=r;i++)
{
for(int j = 1;j<=i;j++)
{
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j];
}
}
int sum=0;
for(int i = 1;i<=r;i++) sum=max(sum,dp[r][i]);
cout<<sum;
}
r1.7
挑战 写完校门外的树。
哈哈你也只能切红了/严肃
口胡
按照顺序模拟就行,但是因为 处还有一棵树,所以下标从 开始。
#include <iostream>
using namespace syh;
int main()
{
int l, m, a[10005]={};
cin>>l>>m;
while(m--)
{
int u, v;
cin>>u>>v;
for(int i = u;i<=v;i++) a[i]=1;
}
int sum=0;
for(int i = 0;i<=l;i++)
{
if(!a[i]) sum++;
}
cout<<sum;
}
r1.5
,看来最近复习的还行。
题解
一道洪水填充DFS,我们先把地图外面一圈都布满 ,在去通过左上角那个 把所有能到的 都标记了,那么这就是外圈的 ,最后输出的时候判断是外圈还是内圈的 就行。
#include <iostream>
using namespace syh;
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
int n, mp[35][35];
bool vis[35][35];
void dfs(int x,int y)
{
if(x<0||x>n+1||y<0||y>n+1||vis[x][y]==1||mp[x][y]==1) return;
vis[x][y]=1;
for(int i = 0;i<4;i++)
{
int nx=dx[i]+x, ny=dy[i]+y;
dfs(nx,ny);
}
}
int main()
{
cin>>n;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
cin>>mp[i][j];
if(mp[i][j]==1)
{
vis[i][j]=1;
}
}
}
dfs(0,0);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
if(mp[i][j]==1) cout<<1<<" ";
else if(vis[i][j]) cout<<0<<" ";
else cout<<2<<" ";
}
cout<<"\n";
}
}
r1.6
反正交了 次。(就是没计时)
口胡
我们知道每个士兵都有 种撤离方法,第 个士兵撤离的时间分别是 与 ,那么我们打擂求最大最小值就可以了。
#include <iostream>
using namespace syh;
int main()
{
int l, n, a[5005], maxt=0, mint=0;
cin>>l>>n;
for(int i = 1;i<=n;i++)
{
cin>>a[i];
maxt=max(maxt,max(l+1-a[i],a[i]));
mint=max(mint,min(l+1-a[i],a[i]));
}
cout<<mint<<" "<<maxt;
}
全部评论 4
dd
8小时前 来自 浙江
0d
8小时前 来自 浙江
0dd
8小时前 来自 浙江
0你都CSPJ啦?
13小时前 来自 浙江
0再不考米白花了
13小时前 来自 浙江
0啊?

13小时前 来自 浙江
0再不考AFO了,初一不打我学OI为了干嘛
13小时前 来自 浙江
0




















有帮助,赞一个