腾讯4月5日后端开发笔试题题解

第一题:求前n项的和,找规律,注意结果是 long long int

#include <iostream>
#include <vector>
#include <map>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
long long int a, b;
int main() {
    ios::sync_with_stdio(false);
    //freopen("input.txt", "r", stdin);
    cin >> a >> b;
    cout << a / (b * 2) * b * b <<endl;
    return 0;
}

第二题:求组成K的可能性
使用组合数做好了。
假设A有x个,B需要(K-A*x)/B个
然后判断是否符合条件就行了
然后根据组合数来

#include <iostream>
#include <vector>
#include <map>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
#define mod 1000000007

int K, A, X, B, Y;
long long ans = 0;
int ta = 0, tb, ca, cb;

int comb[1005][1005];
void init(){
    for(int i = 0; i < 1001; i ++){
        comb[i][0] = comb[i][i] = 1;
        for(int j = 1; j < i; j ++){
            comb[i][j] = comb[i-1][j] + comb[i-1][j-1];
            comb[i][j] %= mod;
        }
    }
}

bool check(int ta, int tb) {
    if (ta % A != 0) return false;
    if (tb % B != 0) return false;
    if (ta / A > X) return false;
    if (tb / B > Y) return false;
    return true;
}
int get(int a, int b) {
    int ca = a / A;
    int cb = b / B;
    return comb[X][ca] * comb[Y][cb];
}
int main() {
    ios::sync_with_stdio(false);
    //freopen("input.txt", "r", stdin);
    init();
    cin >> K >> A >> X >> B >> Y;
    while(ta <= K) {
        tb = K - ta;
        if (check(ta, tb)) {
            ans += get(ta, tb);
            ans %= mod;
        } 
        ta += A;
    }
    cout << ans << endl;
    return 0;
}

第三题:求完成最多的工作和最高的分数
对工作进行排序,优先选择分数最高的工作,每次挑刚好能够完成工作的机器好了,模拟一遍。(我也不知道这样做对不对,反正是所有样例都过了)注意:结果也是 long long int

#include <iostream>
#include <vector>
#include <map>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

int n, m;

pair<int, int> xy[100005];
pair<int, int> zw[100005];
vector<int> jq[105];
bool vis[100005]; 
long long int rc, rs;

bool cmp2(pair<int, int> a, pair<int, int> b) { // 任务 
    int sa = 200 * a.first + 3 * a.second;
    int sb = 200 * b.first + 3 * b.second;
    if (sa != sb) return sa > sb;
    if (a.second != b.second) return a.second > b.second;
    return a.first > b.first;
    //return (200 * a.first + 3 * a.second) > (200 * b.first + 3 * b.second);
}

bool solve(int le, int ti) {
    vector<int>::iterator it;
    for (int i = le; i <= 100; ++i) {
        it = lower_bound(jq[i].begin(), jq[i].end(), ti);
        if (it != jq[i].end()) {
            jq[i].erase(it);
            return true;
        }
    }
    return false;
}

int main() {
    ios::sync_with_stdio(false);
    //freopen("input.txt", "r", stdin);
    cin >> n >> m;
    // 机器 
    for (int i = 0; i < n; ++i) {
        cin >> xy[i].first >> xy[i].second;
        jq[xy[i].second].push_back(xy[i].first);
    }
    // 任务 
    for (int i = 0; i < m; ++i) {
        cin >> zw[i].first >> zw[i].second;
    }
    sort(zw, zw + m, cmp2);
    for(int i = 0; i <= 100; ++i) {
        sort(jq[i].begin(), jq[i].end());
    } 
    rc = 0;
    rs = 0;
    for (int i = 0; i < m; ++i) {
        int le = zw[i].second;
           if (solve(le, zw[i].first)) {
            rs += zw[i].first * 200 + zw[i].second * 3;
            rc ++;
           }
    }
    cout << rc << " " << rs << endl;
    return 0;
}

最后给牛课报一个bug,做完题目还有半小时,写好了题解之后发现我还没有交卷,被提示跳出页面一次。。
就是最开始的那个选择题和编程题类型和题数的那个页面。那个页面应该不用算跳出吧,因为都看不到题目。

#笔试题目#
全部评论
我也觉得贪心有问题,下面这个样例,我跑你的程序输出的是 >> input 2 2 2 99 1 100 1 99 2 0 >> output 1 497 明显答案有问题。 任务 1(1,99) 的 profit 大于任务 2 (2,0),会安排到等级最小时间满足的机器 1 (2,99)上完成。然而,之后的任务 2 (2,0)就无法安排到 (1,100)上完成。 选择等级最小时间满足(较大)的情况并没有优于选择等级稍大时间满足(稍小)的情况。
点赞 回复 分享
发布于 2018-04-07 08:15
超哥你好~~
点赞 回复 分享
发布于 2018-04-05 20:01
我觉得贪心不是最优的,他那个如果A时间是100,等级是0,任务B时间是99,等级是100,然后只有一个机器上面两个任务都能满足,贪心的话选的好像就不是最优的了。。  他改了个条件,那个代价是200x+3y,杭电上有一道一毛一样的条件是500x+3y,那个贪心应该就是最优的了
点赞 回复 分享
发布于 2018-04-06 19:51
我做的题目顺序刚好和楼主相反,第三道是第一道。看到第一道题我都直接觉得凉凉...幸好看了看后面的...
点赞 回复 分享
发布于 2018-04-05 23:59
第二题背包 只过了70 
点赞 回复 分享
发布于 2018-04-05 18:03
第三题在OJ平台上有原题。。。
点赞 回复 分享
发布于 2018-04-05 17:57
厉害了。中午吃了火锅,最后40分钟全在上厕所,诶,不说了。都是泪
点赞 回复 分享
发布于 2018-04-05 17:42
dalao有题目的描述吗?没参加笔试,想看看题的内容😁
点赞 回复 分享
发布于 2018-04-05 17:41
感觉最后一题数据不是很强吧,感觉贪心可以卡掉(逃)
点赞 回复 分享
发布于 2018-04-05 17:36
你们好厉害,学渣飘过
点赞 回复 分享
发布于 2018-04-05 17:33
我写了二分图,70% gg
点赞 回复 分享
发布于 2018-04-05 17:14
最后一题是贪心的思路吗?
点赞 回复 分享
发布于 2018-04-05 17:14
气死了啊,最后一题觉得贪心不行,就写了爆搜骗分,只拿了60%。
点赞 回复 分享
发布于 2018-04-05 17:06
t2我是背包做的,t3我最后和你算法一样,但是怀疑正确性…(我最开始觉得是费用流)
点赞 回复 分享
发布于 2018-04-05 17:04
那个考试入口也计算离开页面的~~ 比较严格,不算BUG。做完题目先交卷再来写题解--。-- 不过你在那个页面离开一次不会算作弊。
点赞 回复 分享
发布于 2018-04-05 17:04

相关推荐

评论
点赞
57
分享

创作者周榜

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