1.8比赛总结

· · 个人记录

我的刷怪做题之路

P1115

错因:

数组开小了

正确代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,dp[200005],a[200005];//dp[i]表示以i结尾的最大数列和 
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    dp[1]=a[1];//边界条件 
    for(int i=2;i<=n;i++)
    {
        dp[i]=max(a[i],dp[i-1]+a[i]);//状态转移方程 
    }
    int maxi=-1e9;
    for(int i=1;i<=n;i++)
        maxi=max(maxi,dp[i]);//求最大的dp 
    cout<<maxi;
    return 0;
}

..........

P6702

错因:

不晓得 思路错误

修改代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,cnt;
signed main()
{
    cin>>n;
    while(n%5)
        n-=3,cnt++;
    if(n<0)
    {
        cout<<-1;
        return 0;
    }
    cout<<cnt+n/5;
    return 0;
}

P1057

这题真不想说,一题数字金字塔的翻版给我们整出了新花样

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int dp[1005][1005];
signed main()
{
    int n,m;
    cin>>n>>m;
    dp[0][1]=1;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(j==1)
                dp[i][1]=dp[i-1][2]+dp[i-1][n];
            else if(j==n)
                dp[i][n]=dp[i-1][1]+dp[i-1][n-1];
            else
                dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];
        }
    }
    cout<<dp[m][1];
    return 0;
}

P1233

噩梦降至,我族者速速归回

无法形容的难度,😭😭😭

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct N{
    int l,w;
}a[50005];
int dp[50005];
int cmp(N x,N y)
{
    if(x.l==y.l)
        return x.w<y.w;
    return x.l<y.l;
}
signed main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i].l>>a[i].w;
    sort(a+1,a+n+1,cmp);
    int maxi=1;
    for(int i=1;i<=n;i++)
    {
        dp[i]=1;
        for(int j=1;j<i;j++)
        {
            if(a[j].l<a[i].l and a[j].w>a[i].w)
            {
                dp[i]=max(dp[i],dp[j]+1);
            }
        }
        maxi=max(maxi,dp[i]);
    }
    cout<<maxi;
    return 0;
}