4.25字节跳动笔试

在这里写下每题的答案吧
1.纸牌均分问题的贪心
由于最左边只能由其右边填补,所以考虑从左边开始遍历,遇到不等于平均值的就从右边补就行了。
代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int N=1005;
int n;
int a[N];

int main() {
    cin>>n;
    ll sum=0;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
        sum+=a[i];
    }
    ll k=sum/n;
    int ans=0;
    for(int i=1;i<=n;i++) {
        if (a[i]<k) {
            a[i+1]-=(k-a[i]);
            a[i]=k;
            ans++;
        }
        if (a[i]>k) {
            a[i+1]+=(a[i]-k);
            a[i]=k;
            ans++;
        }
    }
    cout<<ans;
    return 0;
}

时间复杂度O(n)
2.这题直接dfs就好了,设置一个vis数组记录哪些点被遍历过了,如果遇到vis[x]==0的情况,把其子树中vis[x]==0的点全置1就好了。
代码:

#include<bits/stdc++.h>
#define pb push_back
#define SZ(x) (int)x.size()
using namespace std;

const int N=100005;
int n,x,q,num;
int vis[N];
vector<int> g[N];


void dfs(int x) {
    int len=SZ(g[x]);
    for(int i=0;i<len;i++) {
        int v=g[x][i];
        if (!vis[v]) {
            num++;
            vis[v]=1;
            dfs(v);
        }
    }
}

int main() {
    cin>>n;
    for(int i=1;i<n;i++) {
        cin>>x;
        g[x].pb(i);
    }
    cin>>q;
    int sum=n;
    while(q--) {
        scanf("%d",&x);
        if (!vis[x]) {
            num=1;
            vis[x]=1;
            dfs(x);
            sum-=num;
            printf("%d\n",sum);
        }
        else {
            printf("%d\n",sum);
        }
    }
    return 0;
}

时间复杂度O(n)
3.按照x.dy.c<y.cx.d排序,如果相等的话,id小的在前面。
代码:

#include<bits/stdc++.h>
#define FULL(x,y) memset(x,y,sizeof(x))
#define ll long long
#define SZ(x) (int)x.size()
#define pb push_back
using namespace std;

const int N=1005;

struct node {
    int c,d,id;
}no[N];

bool cmp(const node& x, const node& y) {
    if (x.d*y.c==y.d*x.c) return x.id < y.id;
    return x.d*y.c < y.d*x.c;
}

int n;

int main() {
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>no[i].d>>no[i].c;
        no[i].id=i;
    }
    sort(no+1,no+1+n,cmp);
    for(int i=1;i<=n;i++) {
        cout<<no[i].id<<' ';
    }
    return 0;
}

时间复杂度O(nlogn)。
4.这题应该dp,令dp[i][j]表示以i为结尾且与前面的数相乘%2021==j的最长长度,则有状态转移方程:
dp[i][(a[i]*a[j])%2021]=max(dp[i][(a[i]*a[j])%2021], dp[j][a[i]]+1),当dp[j][a[i]]!=0。且还需维护总数,令开一个cnt[i][j]数组维护。
代码:

#include<bits/stdc++.h>
using namespace std;

const int N=1005;
int n;
int a[N],dp[N][2021],cnt[N][2021],f[N][2021];

int main() {
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
//初始化
    for(int i=1;i<=n;i++) {
        for(int j=i-1;j>=1;j--) {
            dp[i][(a[i]*a[j])%2021]=2;
            f[i][(a[i]*a[j])%2021]++;
        }
    }
//dp
    for(int i=3;i<=n;i++) {
        for(int j=i-1;j>=2;j--) {
            if (dp[j][a[i]]) {
                dp[i][(a[i]*a[j])%2021]=max(dp[i][(a[i]*a[j])%2021],dp[j][a[i]]+1);
            }
        }
//维护数量
        for(int j=i-1;j>=2;j--) {
            if (dp[i][(a[i]*a[j])%2021]==dp[j][a[i]]+1) {
                if (dp[j][a[i]]==2)cnt[i][(a[i]*a[j])%2021]+=f[j][a[i]];
                else cnt[i][(a[i]*a[j])%2021]+=cnt[j][a[i]];
            }
        }
    }
    int ans=0,sum=0;
    for(int i=1;i<=n;i++) {
        for(int j=0;j<2021;j++) {
            if (dp[i][j]>=3) ans=max(ans,dp[i][j]);
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=0;j<2021;j++) {
            if (dp[i][j]==ans) sum+=cnt[i][j];
        }
    }
    if (ans!=0)cout<<sum<<endl<<ans<<endl;
    else cout<<0<<endl<<0<<endl;
    return 0;
}

时间复杂度O(n^2)。

全部评论
第四题看了半天终于看懂了,留下了13滴感动的泪水,不过我觉得dp和维护数量可以合并在一起啊~
点赞 回复 分享
发布于 2021-04-27 17:02
请问有题目吗 佬
点赞 回复 分享
发布于 2021-04-26 17:09
能否给个第三题答案,我太菜
点赞 回复 分享
发布于 2021-04-25 22:11
第三题也想过排序,但没注意序号,现在好后悔
点赞 回复 分享
发布于 2021-04-25 20:04
第四题没怎么看懂题主能解释一下吗?那个递推关系Ai = Ai-1 * Ai-2 mod2021是啥意思啊?您的动态规划方程我也看的云里雾里的。。
点赞 回复 分享
发布于 2021-04-25 16:30
我觉得题目挺简单的,就是第三题奶茶没读懂,能解释一下输入输出样例吗,我愣是没看明白。还有双月是什么意思
点赞 回复 分享
发布于 2021-04-25 15:51

相关推荐

吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
评论
9
8
分享

创作者周榜

更多
牛客网
牛客企业服务