Nowcoder Girl 参考题解

题目练习地址: https://www.nowcoder.com/test/8527168/summary

平方数

分析

签到题。sqrt的枚举或者直接算都可以。

复杂度

O(n^(1/2))

参考代码

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

int n;
int main() {
    cin >> n;
    int ans = 0;
    for(int i = 0; i <= sqrt(n); i++) ans = i * i;
    printf("%d\n",ans);
    return 0;
 }

勇气获得机

分析

仔细观察会发现,每一步的按键方案由奇偶性确定,于是分类确定即可。

复杂度

O(logn)

参考代码

#include <bits/stdc++.h>

using namespace std;

int n;
stack<char> s;
int main() {
    cin >> n;
    while(n) {
        if(n % 2 == 0) {
            n = (n - 2) / 2;
            s.push('G');
        } else {
            n = (n - 1) / 2;
            s.push('N');
        }
    }
    while(!s.empty()) {
        printf("%c", s.top());
        s.pop();
    }
    printf("\n");
    return 0;
}

打车

分析

注意到n很小,直接枚举子集判断是否合法,在所有合法的方案中找size最大。

复杂度

O(2^n)

参考代码

#include <bits/stdc++.h>

using namespace std;

int n, s, p[15];
int main() {
    scanf("%d%d", &n, &s);
    for(int i = 0; i < n; i++) scanf("%d", &p[i]);
    int ans = 0;
    for (int x = 0; x < (1 << n); x++) {
        int mi = 10000000;
        int sum = 0;
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            if ((x & (1 << i)) != 0 ) {
                mi = min(mi, p[i]);
                sum += p[i];
                cnt++;
            }
        }
        if (sum >= s && sum - mi < s) {
            ans = max(ans, cnt);
        }
    }
    cout << ans << endl;

}

排列

分析

如果某个数没有满足错排要求,直接和相邻的位置swap一下,统计次数即可。

复杂度

O(n)

参考代码

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 5;

int a[maxn], n;
int main() {
    cin >> n;
    for(int i = 0; i < n; i++) scanf("%d", &a[i]);
    int res = 0;
    for(int i = 0; i < n - 1; i++) {
        if(a[i] == i + 1) {
            swap(a[i], a[i + 1]);
            res++;
        }
    }
    if(a[n - 1] == n) res++;
    cout << res << endl;
    return 0;
}

美丽的项链

分析

可以通过母函数求解。
比较直接的就直接用背包dp算就行了。

复杂度

O(nmr)

参考代码

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

long long f[2][105];

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    memset(f, 0, sizeof(f));
    f[0][0] = 1;
    for (int i = 1; i <= n; i++) {
        memset(f[i & 1], 0, sizeof(f[i & 1]));
        int l, r;
        scanf("%d%d", &l, &r);
        for (int k = l; k <= r; k++)
            for (int j = m; j >= k; j--)
                f[i & 1][j] += f[i + 1 & 1][j - k];
    }
    printf("%lld\n", f[n & 1][m]);
    return 0;
}

勇敢的妞妞

分析

当k >= 5的时,每一维属性都取最大求和即可。
对于k < 5的时,预处理31种情况可能得到的最大的和。然后dfs枚举子集维护最大的答案即可。

复杂度

O(31 5 n)

参考代码

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e4 + 5;

int mx[10];
int num[maxn][10];
int N, K;
int sta[32];
int dfs(int s, int cur) {
    if(cur == K) return 0;
    int tmp = 0;
    for(int i = s; i; i = (i - 1) & s) tmp = max(tmp, sta[i] + dfs(s ^ i, cur + 1));
    return tmp;
}
int main() {
    scanf("%d%d", &N, &K);
    memset(sta, 0, sizeof(sta));
    memset(mx, 0, sizeof(mx));
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < 5; j++) {
            scanf("%d", &num[i][j]);
            mx[j] = max(mx[j], num[i][j]);
        }
        for(int j = 0; j < 32; j++) {
            int res = 0;
            for(int k = 0; k < 5; k++) {
                if(j & (1 << k)) {
                    res += num[i][k];
                }
            }
            sta[j] = max(sta[j], res);
        }
    }
    if(K >= 5) {
        int ans = 0;
        for(int i = 0; i < 5; i++) ans += mx[i];
        printf("%d\n", ans);
    } else {
        printf("%d\n", dfs(31, 0));
    }
    return 0;
}
#google#
全部评论
有没有python的,题解,python小白做不下去了
点赞 回复 分享
发布于 2017-12-29 15:01
赞果姐
点赞 回复 分享
发布于 2017-12-26 12:30
沙发
点赞 回复 分享
发布于 2017-12-26 09:56
打车那题没问题吗??n个硬币的所有子集不是2^n??另外内循环 x&(1<<i)!=0 是什么意思
点赞 回复 分享
发布于 2017-12-28 23:46
代码是很优雅,然而有点看不懂。。。 第五题的dfs下的循环有谁能讲解一下吗? for(int i = s; i; i = (i - 1) & s) tmp = max(tmp, sta[i] + dfs(s ^ i, cur + 1));
点赞 回复 分享
发布于 2017-12-26 16:27
赞这个小姐姐
点赞 回复 分享
发布于 2017-12-26 11:22
赞这个小姐姐
点赞 回复 分享
发布于 2017-12-26 11:06
代码写的好简洁好好看👍~~  受教受教~~
点赞 回复 分享
发布于 2017-12-26 10:01
题目在哪还能看到?
点赞 回复 分享
发布于 2017-12-26 09:57

相关推荐

02-12 20:22
重庆大学 Java
字节暑期刚入职四天,因为是年前,所以很多正职都放假走了,也就没有给我分配mt,然后有一个老哥在我来的时候给我发了一个landing手册,然后还有关于部门业务的白皮书,还有一些业务代码。然后本人是java面的,进来第一次接触go语言&nbsp;前面几天熟悉了一下go的语法和go的框架,可以读但是还不太会写,然后业务白皮书也看的很头疼,包括landing手册里要了解的很多东西说实话我看文档真的快看死了,一个嵌套一个,问题是我还完全不知道咋用这个我了解的东西,还有就是那个项目代码,那个老哥喊我去写写单测,熟悉一下go的语法,但也进行的很困难(这是我第一段实习,之前都是springboot那一套,真不太熟悉这个)想问问大家的建议,就是我从现在开始到在开年回来之前应该做些什么,我目前就一个想法&nbsp;就是复现一个landing手册上的go框架小项目&nbsp;就是相当于帮自己锻炼锻炼怎么写go&nbsp;或者各位大佬有没有更好的锻炼go语法的建议还有就是大家都在说vibe&nbsp;coding,那我应该怎么锻炼自己使用ai的能力,感觉我除了给一些需求然后它给我生成代码,好像就没别的用法了,那些什么工作流、拆解、skill啥的都不知道从哪一个地方开始,包括我现在正在实习,不知道精力该怎么分配,去网上想找找关于agent开发的一些学习流程,说实话,众说纷纭,有的是从python开始打基础然后系统学那些rag&nbsp;prompt&nbsp;langchain&nbsp;mcp等等,有的是说直接找一个github上的ai项目然后反复问ai,我确实有点迷茫,恳求各位大佬能留下你们宝贵的建议,我一定认真反复深刻学习有一说一&nbsp;我觉得字节饭挺好吃的!
双非后端失败第N人:1. go语言我建议你让ai带着你先把基本语法速通了,然后再去用go重新刷你以前刷过的leetcode,这样熟悉起来很快 2. 直接看你们组go项目,里面用***比较复杂,然后把每一个语法现象都喂给ai,一点点看
字节跳动公司福利 1371人发布
点赞 评论 收藏
分享
评论
11
21
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务