爱奇艺2018校招题解与思路

空中旅行

分析

模拟一下。

参考代码

#include <bits/stdc++.h>

using namespace std;

int n, s;
int f[55];

int main() {
    cin >> n >> s;
    for(int i = 0; i < n; i++) cin >> f[i];
    int cnt = 0;
    int add = f[0];
    for(int i = 0; i < n; i++) {
        if(add <= s) {
            cnt++;
        }
        add = add + f[i + 1];
    }
    cout << cnt << endl;
    return 0;
}

拼凑三角形

分析

暴力枚举,然后维护出答案就好了。

参考代码

#include <bits/stdc++.h>

using namespace std;

int a, b, c;
int main() {
    cin >> a >> b >> c;
    int mx = 0;
    for(int i = 1; i <= a; i++) {
        for(int j = 1; j <= b; j++) {
            for(int k = 1; k <= c; k++) {
                if(i + j > k && i + k > j && j + k > i) {
                    mx = max(mx, i + j + k);
                }
            }
        }
    }
    cout << mx << endl;
    return 0;
}

循环数比较

分析

根据题意模拟比较。当然这个题,不同语言难度不一样。。

参考代码

#include <bits/stdc++.h>

using namespace std;

int x1, x2, k1, k2;

int main() {
    cin >> x1 >> k1 >> x2 >> k2;
    stringstream ss1;
    ss1 << x1;

    string a;
    ss1 >> a;

    stringstream ss2;
    ss2 << x2;

    string b;
    ss2 >> b;
    string aa = "", bb = "";
    for(int i = 0; i < k1; i++) aa += a;
    for(int i = 0; i < k2; i++) bb += b;
    if(aa.size() > bb.size() || (aa.size() == bb.size() && aa > bb)) {
        cout << "Greater" << endl;
    } else if(aa.size() < bb.size() || (aa.size() == bb.size() && aa < bb)) {
        cout << "Less" << endl;
    } else {
        cout << "Equal" << endl;
    }
    return 0;
}

红和绿

分析

枚举分界点,然后分别统计需要的次数,记录最小值就是答案。

参考代码

#include <bits/stdc++.h>

using namespace std;

string s;
int main() {
    cin >> s;
    int len = s.size(); 
    int ans = len;
    for(int i = 0; i <= len; i++) {
        int need = 0;
        for(int j = 0; j < i; j++) {
            if(s[j] != 'R') need++;
        }
        for(int j = i; j < len; j++) {
            if(s[j] != 'G') need++;
        }
        ans = min(ans, need);
    }
    cout << ans << endl;
    return 0;
}

括号匹配深度

分析

记录当前'('出现的次数cnt,出现')'就完成一次匹配,维护整个过程中cnt的最大值就是答案。

参考代码

#include <bits/stdc++.h>

using namespace std;

string s;
int main() {
    cin >> s;
    int ans = 0, cnt = 0;
    for(int i = 0; i < s.size(); i++) {
        if(s[i] == '(') {
            cnt++;
            ans = max(ans, cnt);
        } else if(s[i] == ')') {
            cnt--;
        }
    }
    cout << ans << endl;
    return 0;
}

平方根问题

分析

(sqrt(a) + sqrt(b)) (sqrt(a) + sqrt(b))
= sqrt(a)
sqrt(a) + 2 sqrt(a) sqrt(b) + sqrt(b) sqrt(b)
= sqrt(a
a) + 2 sqrt(a b) + sqrt(bb)
= a + 2
sqrt(a * b) + b

于是原问题就是看a*b是否能是完全平方数,详细做法见代码注释。

参考代码

#include <bits/stdc++.h>

using namespace std;

int solve(int N, int M) {
    int res = 0;
    for (int a = 1; a <= N; a++) {
        int s = 1;
        //找到最大的s,让a是s*s的倍数
        // O(sqrt(N))
        for (int x = 2; x <= a / x; x++) {
            if (a % (x * x) == 0) {
                s = x * x;
            }
        }
        int r = a / s;
        //a * r 是一个完全平方数
        //如果b = r * c, 我们要让a * b是一个平方数,需要c也是一个完全平方数
        // O(sqrt(M))
        for (int y = 1; y * y * r <= M; y++) {
            //(a, r * r * y)是一个合法的解
            res++;
        }
    }
    return res;
}
int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    printf("%d\n", solve(n, m));
    return 0;
}

奶牛编号

分析

贪心。排序一下,然后答案就是所有x[i] - i的乘积。

参考代码

#include <bits/stdc++.h>

using namespace std;

const int mod = 1e9 + 7;

int x[55];
int n;
int main() {
    cin >> n;
    for(int i = 0; i < n; i++) cin >> x[i];
    long long res = 1;
    sort(x, x + n);
    for(int i = 0; i < n; i++) {
        res *= x[i] - i;
        res %= mod;
    }
    cout << res << endl;
    return 0;
}

奇异数

分析

分析一下这种数字的特征,我们会发现这种数字出现的规律。
我们先把上下界处理到整100的地方,剩下的就可以快速计算了。

参考代码

#include <bits/stdc++.h>

using namespace std;

long long L, R;

int main() {
    cin >> L >> R;
    long long ans = 0;
    while(L <= R && (L % 100)) ans += ((L % 10) == ((L / 10) % 10)), L++;
    while(L <= R && (R % 100)) ans += ((R % 10) == ((R / 10) % 10)), R--;
    if(L > R) {
        cout << ans << endl;
    } else {
        cout << ans + ((R - L) / 100) * 10 + 1;
    }
    return 0;
}

平方串

分析

枚举间断点把字符串分成两部分,然后计算两个部分的LCS,维护最大值就是最后所求答案的一半。

参考代码

#include <bits/stdc++.h>

using namespace std;


int LCS(string X, string Y) { 
    if (Y.length() > X.length()) 
        swap(X, Y); 
    int m = X.length(), n = Y.length(); 
    vector< vector<int> > c(2, vector<int>(n + 1, 0)); 
    int i, j; 
    for(i = 1;i <= m;i++) { 
        for(j = 1;j <= n;j++) { 
            if (X[i - 1] == Y[j - 1]) 
                c[1][j] = c[0][j - 1] + 1; 
            else 
                c[1][j] = max(c[1][j - 1], c[0][j]); 
        } 
        for(j = 1;j <= n;j++) 
            c[0][j] = c[1][j]; 
    } 
    return (c[1][n]); 
} 
string s;
int main() {
    cin >> s;
    string st = s;
    int ans = 0;
    for(int cp = 1; cp < st.size(); cp++) {
        string st1, st2;
        for(int i = 0; i < st.size(); i++) {
            if(i < cp) st1 += st[i];
            else st2 += st[i];
        }
        ans = max(ans, LCS(st1, st2));
    }
    cout << ans * 2 << endl;
    return 0;
}
全部评论
三角形那个题,直接先判断能不能构成三角形,不行的话,最长边等于两短边和-1就可以了啊 #include <iostream> #include <vector> #include <algorithm> #include <numeric> using namespace std; int main() { vector<int>edges(3); for (int i = 0; i < 3; ++i) { cin >> edges[i]; } sort(edges.begin(), edges.end()); if (edges[1] + edges[0]>edges[2] && edges[2] - edges[0] < edges[1]) { cout << edges[0] + edges[1] + edges[2] << endl; } else { cout << 2 * (edges[0] + edges[1]) - 1 << endl; } return 0; }
点赞 回复 分享
发布于 2017-09-10 21:41
三角形那个不用递归吧,如果初始满足直接打印,不满足,最长边等于其余两边和减一
点赞 回复 分享
发布于 2017-09-10 21:22
奶牛我也这么做的只a了50%。。。
点赞 回复 分享
发布于 2017-09-10 21:14
@远足者  这是后台通过的python其他人,还不少。。
点赞 回复 分享
发布于 2017-09-10 21:16
爱奇艺奶牛问题: import java.math.BigInteger; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] arr = new int[n]; for(int i = 0; i<n; i++){ arr[i] = in.nextInt(); } Arrays.sort(arr); Main solutionWay = new Main (); System.out.println(solutionWay.solution(n,arr)); } public BigInteger solution(int n, int[] arr){ BigInteger num = BigInteger.valueOf(1); final BigInteger mode = BigInteger.valueOf(1000000007L); for(int i = 0; i < arr.length; i++){ if(arr[i] - i > 0){ num = num.multiply( BigInteger.valueOf(arr[i]-i)); } else{ num = BigInteger.valueOf(0); } } return num.mod(mode); } }
点赞 回复 分享
发布于 2017-09-11 10:07
66666
点赞 回复 分享
发布于 2017-09-10 21:10
平方串那个题目,我跟楼主的想法一样,但是python超时了,是我代码的细节问题还是python的速度问题?有用python解题的大佬么?
点赞 回复 分享
发布于 2017-09-10 21:11
沙发!抢地主
点赞 回复 分享
发布于 2017-09-10 21:11
涂色那个题 我怎么没想到 只考虑了特殊情况 还是自己蠢啊
点赞 回复 分享
发布于 2017-09-10 21:12
在哪里可以交?
点赞 回复 分享
发布于 2017-09-10 21:12
括号匹配那个可以AC100% 吗?我的为什么只有%60
点赞 回复 分享
发布于 2017-09-10 21:21
都a了几道 啊??
点赞 回复 分享
发布于 2017-09-10 21:22
//开方的题不知道为什么不对 public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); int n, m; while(sc.hasNext()) { n = sc.nextInt(); m = sc.nextInt(); int count_n = getSquareNum(n); int count_m = getSquareNum(m); int i = 1; int res = 0; while(i <= n && i <= m) { if(judgeSquare(i)) { res += count_n; res += count_m; count_n--; count_m--; res--; } else { res += getSquareNum(n / i); res += getSquareNum(m / i); res--; } i++; } System.out.println(res); } sc.close(); } public static int getSquareNum(int n) { return (int) Math.floor(Math.sqrt(n)); } public static boolean judgeSquare(int n) { return Math.sqrt(n) % 1 == 0; } }
点赞 回复 分享
发布于 2017-09-10 21:29
能把题目发一下吗,想看看其他的题
点赞 回复 分享
发布于 2017-09-10 21:38
爬山那题,用动态规划,但是f(0)怎么确定啊
点赞 回复 分享
发布于 2017-09-10 21:49
奶牛编号问题60%,思路和代码跟提供的一模一样,唯一不同的就是楼主是每一次循环都%,我是最后%一次,可能原因是long long都无法表示这个结果?所以导致不能AC,而楼主每次都%很好的控制了res不溢出
点赞 回复 分享
发布于 2017-09-10 21:50
java岗,编程2.4能进面试么?选择题做得不好,有点儿担心
点赞 回复 分享
发布于 2017-09-10 21:53
哎,差一点,平方数这个题的解放真是太巧了。主要是java中的sqrt()方法还是太慢了,想用传统方法暴力解根本不可能。
点赞 回复 分享
发布于 2017-09-10 21:58
平方根的解法 仿佛让我回到了小学奥数题。
点赞 回复 分享
发布于 2017-09-10 22:15
平方根题解没太看懂,有大佬详细详细解释下吗?谢谢!
点赞 回复 分享
发布于 2017-09-10 23:17

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务