223847比赛总结

· · 个人记录

开篇语

比赛网址

在寒假模拟赛总结(2025年1月8日)

加油努力,最后没考好!
T1 斐波那契数列
T2 最大子段和
T3 最长上升子序列
T4 [COCI2010-2011#7] ŠEĆER
T5 [NOIP2008 普及组] 传球游戏
T6 木棍加工

T1

其实就是一道模板题直接AC,这是代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, a, f[35];
signed main()
{
    cin >> n;
    while(n --)
    {
        cin >> a;
        f[1] = 1;
        f[2] = 1;
        if(a == 1 || a == 2)
        {
            cout << 1 << "\n";
            continue;
        }
        for(int i = 3; i <= a; i ++)
        {
            f[i] = f[i - 1] + f[i - 2];
            if(i == a)
            {
                cout << f[a] << "\n";
            }
        }
    }
    return 0;
}

T2

这一道题也是模板题(但因为我模板不熟练)所以WA了,错误原因:模板错误,错误代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2000005;
int n, a[N];
int f[N];
signed main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++)
        cin >> a[i];

    int ans = 0;
    f[1] = 1;
    f[2] = 1;
    for(int i = 3; i <= n; i ++)
    {
        for(int j = 1; j < i; j ++)
        {
            if(a[i] > a[j])
                f[i] = max(a[i], f[j] + a[i]);
        }
    }
    for(int i = 1; i <= n; i ++)
        ans = max(ans, f[i]);
    cout << ans << "\n";
    return 0;
}

正确思路动态dp:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 200005;
int n, a[N], maxi = -1e9, dp[N];
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(dp[i - 1] + a[i], a[i]);
    for(int i = 1; i <= n; ++ i) maxi = max(dp[i], maxi);
    cout << maxi << "\n";   
    return 0;
}

T3

最长上升子序列,这一道题纯属脑袋一热一通乱写,0分代码(错误点最后ans的赋值和for循环中的赋值其实就是模板):

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5005;
int n, a[N], f[N], ans;
signed main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    f[1] = 1;
    f[2] = 1;
    for(int i = 2; i <= n; i ++)
    {
        for(int j = 1; j < j; j ++)
        {
            if(a[i] > a[j])
                f[i] = max(a[i], a[j] + 1);
        }
    }
    for(int i = 1; i <= n; i ++)
        ans = max(a[i], f[i]);
    cout << ans << "\n";
    return 0;
}

AC更改代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[5005],f[5005];
signed main()
{
    int n,maxx=-1e9;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        f[i]=1;
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<i;j++)
        {
            if(a[j]<a[i])
            {
                f[i]=max(f[i],f[j]+1);
            }
        }
        maxx=max(maxx,f[i]);
    }
    cout<<maxx;
    return 0;
} 

T4

这道题考研数学思维,可是我数学不错过于自大所以AC,代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, ans = 1000000;
signed main()
{
    cin >> n;
    for(int i = 0; i <= n; i ++)
    {
        for(int j = 0 ; j <= n; j ++)
        {
            if(i * 5 + j * 3 == n)
            {
                if(i + j < ans)
                {
                    ans = i + j;
                }
            }
        }
    }
    if(ans == 1000000)
    {
        cout << -1 << "\n"; 
    }
    else
    {
        cout << ans;
    }
    return 0;
}

T5

这道题是根本不会做,只能骗骗分。其实就是用f数组去判断,找规律。这里就没必要看骗分代码了,直接看AC的。

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

T5

这道题我用结构体排序,结果

18分代码说错误,听取WA声一片。

然后再老师的指导后改了亿下。

#include <bits/stdc++.h>
using namespace std; 
#define int long long
const int N = 5005;
int n;
int sum;
struct node{
    int c, k, ch;
}a[N];
bool cmp(node x, node y)
{
    return x.ch > y.ch;
}
signed main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++)
        cin >> a[i].c >> a[i].k;
    sort(a + 1, a + 1 + n, cmp);
    for(int i = 1; i <= n; i ++)
    {
        if(a[i].c > a[i - 1].k)
            sum ++;
    }
    cout << sum << "\n";
    return 0;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
struct node{
    int l,r;
} a[10005];
int n;
int dp[10005],ans;
bool cmp(node x,node y){ 
    if(x.l==y.l){
        return x.r<y.r;
    }
    return x.l<y.l;
}
int main() 
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].l>>a[i].r;
    } 
    sort(a+1,a+1+n,cmp);
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<i;j++) 
        {
            if(a[j].r>a[i].r) 
            {
                dp[i]=max(dp[j]+1,dp[i]);
            }
        }
        ans=max(dp[i],ans); 
    }
    cout<<ans+1; 
    return 0; 
}

总结到此结束endl

这次没发挥好,下次努力!

加油!奥里给!