8.27 滴滴 tnl

第一题 算式转移

没太了解规则,感觉可能是 遇到连乘或者连加需要重新排序,写了段代码能跑通测试用例,提交 27%
输入输出都调半天

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() 
{ 
    int n;
    cin >> n;
    string str="";
    getline(cin, str);
    getline(cin, str);
    vector<int> num;
    vector<char> sym;
    int ind = -1, len = str.length();
    while(ind < len) {
        int tem = 0;
        char ch = 'o';
        bool flag = true;
        if(str[ind + 1] == '-')
            flag = false, ind++;

        while(++ind < len && str[ind] != ' ')
            tem = tem * 10 + str[ind] - '0';

        if(flag) num.push_back(tem);
        else num.push_back(-tem);
        if(ind == len) break;
        ind++;
        ch = str[ind++];
        sym.push_back(ch);
    }
    for(int i=0; i<n-1; i++) {
        if(sym[i] == '-' || sym[i] == '/') continue;
        int en = i;
        if(sym[i] == '*') {
            while(++en < n-1 && sym[en] == '*') ;
            en++;
        }
        else if(sym[i] == '+') 
            while(++en < n-1 && sym[en] == '+') ;

        vector<int> arr(num.begin()+i, num.begin()+en);
        sort(arr.begin(), arr.end());
        for(int j=i; j<en; j++)
            num[j] = arr[j-i];

        i = --en;

    }
    string res = "";
    for(int i=0; i<n-1; i++)
        res = res + to_string(num[i]) + " " + sym[i] + " ";
    res = res + to_string(num.back());
    cout << res << endl;
    return 0; 
}

第二题 序列移除

这个题目太难理解了,读了半天。。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define INF 0x3f3f3f

int main() {
    int n, total, cost, tot;
    cin >> n >> total >> cost;

    tot = total / cost;

    vector<vector<int>> dp(n+1, vector<int>(tot + 1, INF));
    dp[0][0] = 0;
    vector<int> arr(n+1), brr(n+1);

    for (int i=1; i<=n; i++) cin >> arr[i];
    for (int i=1; i<=n; i++) cin >> brr[i];
    int res = 0, iMax = *max_element(brr.begin(), brr.end());

    vector<vector<int>> hashMap(iMax+1);
    for (int i=1; i<=n; i++) hashMap[brr[i]].push_back(i);

    for (int i=1; i<=n; i++) {
        dp[i][0]=0;
        for (int j=1; j<=tot; j++) {
            dp[i][j] = dp[i-1][j];
            int aa = upper_bound(hashMap[arr[i]].begin(), hashMap[arr[i]].end(), dp[i][j-1]) - hashMap[arr[i]].begin();
            if (aa < hashMap[arr[i]].size()) dp[i][j] = min(dp[i][j], hashMap[arr[i]][aa]);
            if (j > res && j * cost + i + dp[i][j] <= total)  res=j;
        }
    }
    cout << res << endl;
}

图片说明

图片说明

全部评论

相关推荐

02-24 17:39
门头沟学院 Java
神哥不得了:神哥来啦~专业技能的话建议不要前面空那么多,八股的话建议先把高频top 50的八股多巩固几遍,千万不要看那些假高频八股。项目的话,建议换两个高质量的项目上去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务