网易笔试编程题代码共享

第一题矩形覆盖问题,n比较小,所以直接离散化之后暴力即可,需要注意边界重合不算。复杂度O(n^3)
n如果很大的话,可以离散化之后,用扫描线+线段树来做,复杂度O(nlogn)。
#include <iostream> #include <vector> #include <cstdio> #include <algorithm> using namespace std; #define all(x) x.begin(), x.end() const int maxn = 555; int n; vector<int> G; int x_1[maxn], y_1[maxn], x_2[maxn], y_2[maxn]; int getid(int x) {     return lower_bound(all(G), x) - G.begin() + 1; } int cnt[1111][1111]; int main() {     scanf("%d", &n);     for(int i = 0; i < n; i++) scanf("%d", &x_1[i]);     for(int i = 0; i < n; i++) scanf("%d", &y_1[i]);     for(int i = 0; i < n; i++) scanf("%d", &x_2[i]), x_2[i]--;     for(int i = 0; i < n; i++) scanf("%d", &y_2[i]), y_2[i]--;     for(int i = 0; i < n; i++) {         G.push_back(x_1[i]);         G.push_back(y_1[i]);         G.push_back(x_2[i]);         G.push_back(y_2[i]);     }     sort(all(G));     G.erase(unique(all(G)), G.end());     for(int i = 0; i < n; i++) {         x_1[i] = getid(x_1[i]);         y_1[i] = getid(y_1[i]);         x_2[i] = getid(x_2[i]);         y_2[i] = getid(y_2[i]);     }     int ans = 0;     for(int i = 0; i < n; i++) {         for(int j = x_1[i]; j <= x_2[i]; j++)             for(int k = y_1[i]; k <= y_2[i]; k++)                 cnt[j][k]++, ans = max(ans, cnt[j][k]);     }     cout<<ans;     return 0; }

第二题枚举y,之后枚举y的倍数,统计答案即可。复杂度O(nlogn)。
#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
#define all(x) x.begin(), x.end()

int n, k;

int main() {
    scanf("%d%d", &n, &k);
    long long ans = 0;
    if(k == 0) {
        cout<<1LL*n*n<<endl;
        return 0;
    }
    for(int i = k + 1; i <= n; i++) {
        for(int j = k - 1, t = i - 1; j <= n; j += i, t = min(t+i, n)) {
            ans += t - j;
        }
    }
    cout<<ans;
    return 0;
}
第3题,按题意模拟,先把任务要求和能力值离散化,然后插到树状数组里,这样每次询问报酬的时候就是一个区间最大值的查询。复杂度O(nlogn)。
#include <iostream> #include <vector> #include <cstdio> #include <algorithm> using namespace std; #define all(x) x.begin(), x.end() const int maxn = 220000; int n, m; int D[maxn], P[maxn], A[maxn]; vector<int> G; int C[maxn]; int lowbit(int x) {     return x & -x; } void ins(int x, int v) {     for(int i = x; i < maxn; i += lowbit(i))         C[i] = max(C[i], v); } int ask(int x) {     int ans = 0;     for(int i = x; i; i -= lowbit(i))         ans = max(ans, C[i]);     return ans; } int get(int x) {     return lower_bound(all(G), x) - G.begin() + 1; } int main() {     scanf("%d%d", &n, &m);     for(int i = 1; i <= n; i++) {         scanf("%d%d", &D[i], &P[i]);         G.push_back(D[i]);     }     for(int i = 1; i <= m; i++) {         scanf("%d", &A[i]);         G.push_back(A[i]);     }     sort(all(G));     G.erase(unique(all(G)), G.end());     for(int i = 1; i <= n; i++) {         D[i] = get(D[i]);         ins(D[i], P[i]);     }     for(int i = 1; i <= m; i++)         A[i] = get(A[i]);     for(int i = 1; i <= m; i++)         printf("%d\n", ask(A[i]));     return 0; }
#笔试题目#
全部评论
哪位大佬解释一下,为什么那个输入的时候离散化,右上角的坐标都要--?
点赞 回复 分享
发布于 2018-03-28 20:55
为啥我们题目不一样。。。
点赞 回复 分享
发布于 2018-03-27 21:31
给大佬跪了
点赞 回复 分享
发布于 2018-03-27 21:34
第二题,我和你思路差不多,第二个循环我还用数学表达式写的然而只过了30
点赞 回复 分享
发布于 2018-03-27 21:34
好强啊
点赞 回复 分享
发布于 2018-03-27 21:35
我的题目也不一样。。
点赞 回复 分享
发布于 2018-03-27 21:38
给大佬献出膝盖 前两道和大佬思路一样就是不能AC
点赞 回复 分享
发布于 2018-03-27 21:38
想法一样,然而没有AC,代码实现还是弱啊。。
点赞 回复 分享
发布于 2018-03-27 21:43
给大佬跪了
点赞 回复 分享
发布于 2018-03-27 21:44
第二题用数学归纳法总结的公式 就做两次除法,没有循环,A了90%,想不通原因
点赞 回复 分享
发布于 2018-03-27 21:45
为大佬献出膝盖
点赞 回复 分享
发布于 2018-03-27 21:46
大佬
点赞 回复 分享
发布于 2018-03-27 21:46
我一直奇怪为什么我的就卡在30%不能ac
点赞 回复 分享
发布于 2018-03-27 22:01
为大佬献出膝盖
点赞 回复 分享
发布于 2018-03-27 22:02
惊了。。原来是这么做的吗。。
点赞 回复 分享
发布于 2018-03-27 22:22

相关推荐

不愿透露姓名的神秘牛友
11-07 17:00
点赞 评论 收藏
分享
头像
11-09 17:30
门头沟学院 Java
点赞 评论 收藏
分享
点赞 32 评论
分享
牛客网
牛客企业服务