4.9美团笔试cpp,227%,欢迎大佬拍砖

大家一起讨论,求大佬拍砖

第一题日期操作,感觉自己写的没问题,只AC了72%,很奇怪
#include<bits/stdc++.h>
using namespace std;

/*
3 
02:10 
200 

输出:
周几
时间
*/
int main() {
    int now_day; string time; int interval;
    string tmp_hour; string tmp_minute; int comma;
    cin >> now_day >> time >> interval;
    tmp_hour = time.substr(0, 2);
    tmp_minute = time.substr(3);
    int hour = stoi(tmp_hour);
    int minute = stoi(tmp_minute);
    int cur_time = hour * 60 + minute;
    
    interval = interval % 10080;
    int i = interval / 1440;
    i = i % 7;
    interval = interval % 1440; //不处理天数
    int pre_time = cur_time - interval;
    int pre_day = now_day;
    if (pre_time < 0) {
        pre_day--;
        pre_time = 1440 - abs(pre_time);
    }
    pre_day -= i;
    if (pre_day < 0) pre_day += 8;
    int pre_hour = pre_time / 60; int pre_minute = pre_time % 60;

    cout << pre_day << endl;
    if (pre_hour < 10) cout << "0";
    cout << pre_hour << ":";
    if (pre_minute < 10) cout << "0";
    cout<< pre_minute << endl;
    return 0;
}
第二题找逆序对,开始用的错误算法,后来用dp,一次过;
#include<bits/stdc++.h>
using namespace std;

/*
5
5 3 1 4 2
2 4 5 1 3

3
*/
int main() {
    int n; cin >> n;
    int cnt = 0;
    vector<int> vec1(n);
    vector<int> vec2(n);
    vector<int> dp(n); //dp表示,之后的所有人里最早出发的
    map<int, int> mp;
    for (int i = 0; i < n; i++) { 
        cin >> vec1[i]; 
        mp[vec1[i]] = i;
    }
    for (int i = 0; i < n; i++) cin >> vec2[i];
    //for (int i = 0; i < n; i++) {
   //     int tmp = vec2[i];
    //    if (i > mp[tmp]) cnt++;
   // }
    dp[n - 1] = mp[vec2[n-1]];
    for (int i = n - 2; i >= 0; i--) {
        int tmp = vec2[i+1];
        dp[i] = min(dp[i + 1], mp[tmp]);
    }
    for (int i = n-1; i >=0; i--) {
        int tmp = vec2[i];//如果该人晚于后面任意一个人(最早出发)出发,那么算一次超越
        if (mp[tmp] > dp[i]) cnt++;
    }

    cout << cnt;
    return 0;
}
第三题,开始用暴力方法做超时,后来改等比数列求和,还是超时。。。27%
#include<bits/stdc++.h>
using namespace std;

/*
10 3

8

*/
int main() {
    int n, k;
    cin >> n >> k;
    /*
        for (int i = k; i < n; i++) {
        //i是第一天修的bug, 第二天 i/ k
        int remain = n;
        int tmp_i = i;
        while (tmp_i) {
            remain -= tmp_i;
            tmp_i /= k;
        }
        if (remain == 0) { cout << i; return 0; }
    }
    */

    for (int i = k; i < n; i++) {
        //i是第一天修的bug, 第二天 i/ k
        int remain = n;
        int tmp_i = i;
        int exp = 0;
        int tmp_n = n;
        while (tmp_n > 0) { tmp_n /= k; exp++; };
        int exp_ = log(tmp_n);
        int sum = i * (1 - pow((1 / double(k)), exp)) / (1 - 1/double(k));
        if(sum >= n) { cout << i+1; return 0; }
    }
    return 0;
}
第四题,自己走错方向了,没做出来,直接输出的样例,9%,这份代码是交卷后写的,不知道能不能AC
#include<bits/stdc++.h>
using namespace std;

/*
3

6
*/
int ans = 0;
vector<int> path;
int vis[4] = { 0 };
void dfs(int i, int depth, int& step) {
    if (i < 0 || i > 3 || vis[i] == 1) return;
    if (depth == step)
    {
        if (i == 0)
            ans++;
        return;
    }
    for (int k = 0; k < 4; k++) {
        path.push_back(i);
        if (k != i) dfs(k, depth + 1, step);
        path.pop_back();
    }

}
int main() {
    int step; cin >> step;
    dfs(0, 0, step);
    cout << ans;
    return 0;
}
第五题,没来得及思考,直接输出样例,16%。。。

#美团笔试##美团##笔试题目#
全部评论
第一天你的day好像可以为0?第二题暴力ac,第三题二分ac,第四题我只有45%,第五题挺简单的ac忘了
点赞 回复
分享
发布于 2020-04-09 22:49
已经很强了,楼主。就是你的第二题和第四题,能不能写一份题解,菜鸡表示看不太懂
点赞 回复
分享
发布于 2020-04-09 23:12
联易融
校招火热招聘中
官网直投
想问一下怎么看分数??
点赞 回复
分享
发布于 2020-04-10 00:10
我5道AC,第一题straightforward,注意格式;比赛那个题单调栈;改bug那个二分搜索;四面体那个dp;最后一个题straightforward
点赞 回复
分享
发布于 2020-04-10 17:30
第二题的思路很棒,逆序遍历很巧妙。不过感觉其实是不需要开辟dp数组的,只需要维持一个变量就可以了
点赞 回复
分享
发布于 2020-04-11 02:31
大佬收到面试通知了嘛
点赞 回复
分享
发布于 2020-04-11 13:10
偶尔所见,希望给大家一点参考。 美团第四题,是状态转换,我觉得应该归为DP。 前四道AC,第五道47%(因为用暴力搜索,时间超时) 第一题注意格式(我是负号格式没注意,修改了很久)。 第二题是寻找自己是否超过了前面的人,我使用循环,然后依次匹配。 第三题是修bug,一方面是等比数列求和的知识。具体见图(写不下了) 见图片。 using namespace std; const int need_mod = 1000000007; int main() {     int K;//允许走的步数     cin >> K;     if(K==0)cout << 1;     else if(K==1)cout << 0;     else if(K==2)cout << 3;     else if(K==3)cout << 6;     if(K<=3){         return 0;     }     //初始化     int dpS = 1, dpS_pre;     int dpA = 0, dpB = 0, dpC = 0;     int dpA_pre, dpB_pre, dpC_pre;     for(int i=1; i<=K; i++){         //第i步的操作         dpS_pre = dpS; dpA_pre = dpA; dpB_pre = dpB; dpC_pre = dpC;         dpS = ((dpA_pre + dpB_pre)%need_mod + dpC_pre)%need_mod;//dpA、dpB、dpC此时 i-1步,在这些位置         dpA = ((dpB_pre + dpC_pre)%need_mod + dpS_pre)%need_mod;         dpB = ((dpA_pre + dpC_pre)%need_mod + dpS_pre)%need_mod;         dpC = ((dpA_pre + dpB_pre)%need_mod + dpS_pre)%need_mod;     }     cout << dpS; }
点赞 回复
分享
发布于 2020-04-12 13:20
直接输出样例也可以,我学到了
点赞 回复
分享
发布于 2020-04-14 20:57
没做过笔试,想请教下这种在线编程笔试,是可以像leetcode那样不断运行调试吗?还是一旦提交运行就再也不能改了?谢谢!😂
点赞 回复
分享
发布于 2020-04-15 11:28

相关推荐

1 5 评论
分享
牛客网
牛客企业服务