3.18上午美团暑期实习第二次笔试 AK

1、二维前缀和

#include<bits/stdc++.h>
#define x first
#define y second
#define mem(a,b) memset(a,b,sizeof(a))
#define F(i,l,r) for(int i=l;i<=r;i++)
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;

const int N=1005;

int g[N][N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n,a,b;
    cin>>n>>a>>b;
    for(int i=1;i<=n;i++)
    {
        int x,y;
        cin>>x>>y;
        g[x][y]++;
    }
    for(int i=1;i<=1000;i++)
    {
        for(int j=1;j<=1000;j++)
        {
            g[i][j]+=g[i-1][j]+g[i][j-1]-g[i-1][j-1];
        }
    }
    int ans=0;
    for(int i=1;i<=1000;i++)
    {
        for(int j=1;j<=1000;j++)
        {
            ans=max(ans,g[i][j]-g[max(0,i-a-1)][j]-g[i][max(0,j-b-1)]+g[max(0,i-a-1)][max(0,j-b-1)]);
        }
    }
    cout<<ans<<endl;
    return 0;
}

2、set

#include<bits/stdc++.h>
#define x first
#define y second
#define mem(a,b) memset(a,b,sizeof(a))
#define F(i,l,r) for(int i=l;i<=r;i++)
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;

const int N=2e5+1000;

int n,k,a[N];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];

    int ans=0;
    for(int i=1;i<=n;i++)
    {
        set<int> s;
        int j=i;
        while(j<=n)
        {
            s.insert(a[j]);
            if(s.size()>k)
                break;
            j++;
        }
        ans=max(ans,j-i);
    }
    cout<<ans<<endl;
    return 0;
}

3、corner case挺多的

#include<bits/stdc++.h>
#define x first
#define y second
#define mem(a,b) memset(a,b,sizeof(a))
#define F(i,l,r) for(int i=l;i<=r;i++)
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;

const int N=2e5+1000;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);


    string s;
    cin>>s;
    int n=s.size();
    s='#'+s;
    int l=1,r=n;
    vector<pii> pos;
    while(l<r)
    {
        if(s[l]!=s[r])
            pos.push_back({l,r});
        l++,r--;
    }
    sort(pos.begin(),pos.end());
    if(pos.size()==0)
    {
        for(int i=1;i<=n;i++)
        {
            if(s[i]!='a')
            {
                s[i]=s[n-i+1]='a';
                break;
            }
        }
    }
    else if(pos.size()==1)
    {
        if(s[pos[0].x]=='a'||s[pos[0].y]=='a')
        {
            if(n&1)
            {
                s[(n+1)/2]='a';
            }
        }
        s[pos[0].x]=s[pos[0].y]='a';
    }
    else
    {
        char c=min(s[pos[0].x],s[pos[0].y]);
        s[pos[0].x]=s[pos[0].y]=c;
        c=min(s[pos[1].x],s[pos[1].y]);
        s[pos[1].x]=s[pos[1].y]=c;
    }

    for(int i=1;i<=n;i++)
        cout<<s[i];
    return 0;
}

4、背包dp

#include<bits/stdc++.h>
#define x first
#define y second
#define mem(a,b) memset(a,b,sizeof(a))
#define F(i,l,r) for(int i=l;i<=r;i++)
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;

const int N=2e5+1000;

int a[N],b[N];
int dp[105][5005][55],cost[105][5005][55];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n,x,y;
    cin>>n>>x>>y;
    for(int i=1;i<=n;i++)
        cin>>a[i]>>b[i];

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=x;j++)
        {
            for(int k=0;k<=y;k++)
            {
                dp[i][j][k]=dp[i-1][j][k];
                cost[i][j][k]=cost[i-1][j][k];
                if(j-a[i]>=0)
                {
                    if(1+dp[i-1][j-a[i]][k]>dp[i][j][k])
                    {
                        dp[i][j][k]=1+dp[i-1][j-a[i]][k];
                        cost[i][j][k]=cost[i-1][j-a[i]][k]+a[i];
                    }
                    else if(1+dp[i-1][j-a[i]][k]==dp[i][j][k])
                        cost[i][j][k]=min(cost[i][j][k],cost[i-1][j-a[i]][k]+a[i]);
                }
                if(j-b[i]>=0&&k>=1)
                {
                    if(1+dp[i-1][j-b[i]][k-1]>dp[i][j][k])
                    {
                        dp[i][j][k]=1+dp[i-1][j-b[i]][k-1];
                        cost[i][j][k]=cost[i-1][j-b[i]][k-1]+b[i];
                    }
                    else if(1+dp[i-1][j-b[i]][k-1]==dp[i][j][k])
                        cost[i][j][k]=min(cost[i][j][k],cost[i-1][j-b[i]][k-1]+b[i]);
                }
            }
        }
    }
    int mn=1e9;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=x;j++)
        {
            for(int k=0;k<=y;k++)
            {
                //cout<<i<<" "<<j<<" "<<k<<" "<<dp[i][j][k]<<" "<<cost[i][j][k]<<endl;
                if(dp[i][j][k]==dp[n][x][y])
                    mn=min(mn,cost[i][j][k]);
            }
        }
    }
    cout<<dp[n][x][y]<<" "<<mn<<endl;
    return 0;
}

5、dfs

#include<bits/stdc++.h>
#define x first
#define y second
#define mem(a,b) memset(a,b,sizeof(a))
#define F(i,l,r) for(int i=l;i<=r;i++)
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;

const int N=2e5+1000;

int n,d[N],sum[N];
vector<int> g[N];

void dfs(int u,int fa,int dst)
{
    if(dst<0)
        return;
    sum[u]++;
    for(int v:g[u])
    {
        if(v!=fa)
            dfs(v,u,dst-1);
    }

}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>d[i];
    for(int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    for(int i=1;i<=n;i++)
        dfs(i,0,d[i]);
    for(int i=1;i<=n;i++)
        cout<<sum[i]<<" ";
    return 0;
}

#我的实习求职记录##我的实习日记#
全部评论
大佬 其他OJ上有没有类似第四题的题啊
2 回复 分享
发布于 2023-03-18 12:36 日本
大佬能讲一下第一题二维前缀和的思路吗?小菜鸡看不懂
1 回复 分享
发布于 2023-03-18 13:23 北京
大佬,可以写个Java版本吗?想学习一下
1 回复 分享
发布于 2023-03-18 13:38 上海
佬~
1 回复 分享
发布于 2023-03-18 16:01 吉林
想请问大佬一个问题,在笔试的时候你的头文件和定义是提前写好的吗,笔试可以直接使用吗,会不会被判作弊呀
1 回复 分享
发布于 2023-03-18 17:13 香港
点赞 回复 分享
发布于 2023-03-18 12:21 浙江
大佬
点赞 回复 分享
发布于 2023-03-18 12:26 江西
点赞 回复 分享
发布于 2023-03-18 12:34 上海
太强了
点赞 回复 分享
发布于 2023-03-18 12:43 江苏
佬tql
点赞 回复 分享
发布于 2023-03-18 12:44 湖南
太强了
点赞 回复 分享
发布于 2023-03-18 12:47 北京
tql
点赞 回复 分享
发布于 2023-03-18 12:51 北京
求教:第四题最大化数量,贪心不可以吗
点赞 回复 分享
发布于 2023-03-18 13:11 湖北
关注一手大佬
点赞 回复 分享
发布于 2023-03-18 13:45 广东
大佬,这么短时间都A也太强了
点赞 回复 分享
发布于 2023-03-18 15:23 香港
留下了不争气的泪水
点赞 回复 分享
发布于 2023-03-18 16:47 广东
佬请问第四题是否真的有必要开两个数组呢,一个三维数组能做嘛
点赞 回复 分享
发布于 2023-03-18 17:04 上海
请教一下第四题的思路。。
点赞 回复 分享
发布于 2023-03-19 16:39 江苏
tql
点赞 回复 分享
发布于 2023-03-21 09:40 江苏

相关推荐

11-08 10:39
门头沟学院 C++
点赞 评论 收藏
分享
46 85 评论
分享
牛客网
牛客企业服务