4.1错题总结

· · 个人记录

T2(P5638 【CSGRound2】光骓者的荣耀)

考试思路:前缀和取最大的可传送距离,用总路程减去,就行了

时间复杂度:O(n)

考试代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int sum[1000005],a[1000005],n,k;
signed main()
{
    cin>>n>>k;
    for(int i=1;i<n;i++)
        cin>>a[i],sum[i]=sum[i-1]+a[i];
    int mx=-1e9;
    for(int i=1;i<n-k;i++)
        mx=max(mx,sum[i+k]-sum[i]);
    cout<<sum[n-1]-mx;
    return 0;
}

错误原因:取最大值应该是从0开始,从1开始只能取第2段路到第n段路,第一段路取不了,从0开始就可以取

正确思路:前缀和取最大的可传送距离,用总路程减去,就行了

时间复杂度:O(n)

正确代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int sum[1000005],a[1000005],n,k;
signed main()
{
    cin>>n>>k;
    for(int i=1;i<n;i++)
        cin>>a[i],sum[i]=sum[i-1]+a[i];
    int mx=-1e9;
    for(int i=0;i<n-k;i++)
        mx=max(mx,sum[i+k]-sum[i]);
    cout<<sum[n-1]-mx;
    return 0;
}

T5(P1434 [SHOI2002] 滑雪)

考试思路:bfs每个点都搜一遍

时间复杂度:O(n^4)

考试代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[105][105],mx=-1e9,d[105][105],dx[]={0,0,1,-1},dy[]={1,-1,0,0};
struct N
{
    int x,y;
};
void bfs(int sx,int sy)
{
    memset(d,0,sizeof d);
    queue<N>q;
    q.push({sx,sy});
    d[sx][sy]=1;
    while(q.size()>0)
    {
        N t=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int x=t.x+dx[i],y=t.y+dy[i];
            if(x<1||x>n||y<1||y>m)
                continue;
            if(a[x][y]>=a[t.x][t.y])
                continue;
            d[x][y]=d[t.x][t.y]+1;
            mx=max(mx,d[x][y]);
            q.push({x,y});
        }
    }
    return ;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>a[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            bfs(i,j);
    cout<<mx;
    return 0;
}

错误原因:觉得像bfs,没有去思考是bfs好,还是dfs好,就直接开始写了

正确思路:记忆化+dfs,dp存这个点可以滑的最多数,统计出来

时间复杂度:O(n^3)

正确代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[105][105],dp[105][105],dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};
int dfs(int i,int j)
{
    if(dp[i][j]!=0)
        return dp[i][j];
    dp[i][j]=1;
    for(int i1=0;i1<4;i1++)
    {
        int x=i+dx[i1];
        int y=j+dy[i1];
        if(x<1||x>n||y<1||y>m)
            continue;
        if(a[x][y]<a[i][j])
            dp[i][j]=max(dp[i][j],dfs(x,y)+1);
    }
    return dp[i][j];
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>a[i][j];
    int mx=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            mx=max(mx,dfs(i,j));
    cout<<mx<<endl;
    return 0;
}