题解 | 小红的大模型推理 Token 调度

小红的大模型推理 Token 调度

https://www.nowcoder.com/practice/f4905e18fd3d4dc8afa9ba0af7ae1378

#include <cstddef>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;

vector<vector<ll>> parseVectorFromString(const string& s) {
    vector<vector<ll>> res;
    res.push_back(vector<ll>());
    
    stringstream ss(s);
    string token;

    while (getline(ss, token, ',')) {
        // size_t start = token.find_first_not_of(" ");
        // size_t end = token.find_last_not_of(" ");
        // if (start != string::npos && end != string::npos) {
        //     token = token.substr(start, end - start + 1);
        // }
        // if (!token.empty()) {
        ll val = stoi(token);
        // 分段
        if (val <= 0) res.push_back(vector<ll>());
        else res.back().push_back(val);
        // }
    }
    return res;
}

int main() {
    string s;
    getline(cin, s);
    auto paras = parseVectorFromString(s);
    ll ans = 0;
    for (auto para : paras) {
        // 注意要判空,否则会有段错误,空的段不用处理
        if (para.empty()) continue;
        vector<ll> need(para.size(), 1);
        for (int i = 1; i <= para.size() - 1; i++) 
            if (para[i] > para[i - 1]) need[i] = max(need[i], need[i - 1] + 1);
        for (int j = para.size() - 2; j >= 0; j--) 
            if (para[j] > para[j + 1]) need[j] = max(need[j], need[j + 1] + 1);
        // for (int i = 0; i < para.size(); i++)
        //     cout << para[i] << " " << need[i] << endl;
        // cout << endl;
        for (int x : need) ans += x;
    }
    cout << ans;
}
// 64 位输出请用 printf("%lld")

先将逗号分隔格式的输入解析到vector里,解析同时可以完成基于无效请求的分段。然后,对于每个段,求需要分配的token数,从前往后、从后往前各遍历一遍,注意要用 max(need[i], need[i - 1] + 1)max(need[j], need[j + 1] + 1),防止被覆盖。

全部评论

相关推荐

牛客20485985...:抱抱😘,首先你还有春招,然后就算这时候没上岸也没关系,大部分人都是这样,毕业了再找也成,最后工作只是生活的一小部分,找到工作也不是一个必须的事情。不要气馁不要焦虑你只是陷入了短暂的低谷,你也一直有退路
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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