友塔-3-17码上offer

一星

给定一个 m,求一个 m = 2^a + 2^b 的 a 和 b 是否存在,存在正序输出,不存在则输出-1

// 100%, 这道题没记录,只能靠记忆,可能有差错
int main()
{
    int m;
    while ( cin >> m )
    {
        if ( m == 0 || m == 1 )
        {
            cout << "-1" << endl;
            continue;
        }
        int a = log2(m);
        if ( m == pow(2, a) )
        {
            cout << a - 1 << " " << a - 1 << endl;
        }
        else
        {
            int b = log2(m - pow(2, a));
            if ( m - pow(2, a) == pow(2, b) )
            {
                cout << min(a, b) << " " << max(a, b) << endl;
            }
            else
            {
                cout << "-1" << endl;
            }
        }
    }
}

二星

数组排序,每次只能用0和其他排

bool IsSort(const vector<int> vec)
{
    for ( auto i = 0; i < vec.size(); ++i )
    {
        if ( i != vec[i] )
            return false;
    }
    return true;
}

vector<int> NotSortNum(const vector<int> vec)
{
    vector<int>res;
    for ( auto i = 0; i < vec.size(); ++i )
    {
        if ( i != vec[i] )
        {
            res.push_back(vec[i]);
        }
    }
    return res;
}
int main()
{
    long long n;
    while ( cin >> n )
    {
        vector<int>numVec(n);
        map<int, int>numMap;
        for ( auto i = 0; i < n; ++i )
        {
            cin >> numVec[i];
            numMap[numVec[i]] = i;
        }
        int count = 0;
        while ( !IsSort(numVec) )
        {
            auto noSort = NotSortNum(numVec);
            if ( numMap[0] == 0 && !noSort.empty() )
            {
                auto secondPos = numMap[noSort[0]];
                swap(numVec[0], numVec[secondPos]);
                numMap[0] = secondPos;
                numMap[noSort[0]] = 0;
                ++count;
            }
            if ( numMap[0] != 0 && !noSort.empty() )
            {
                auto zeroPos = numMap[0];
                auto secondPos = numMap[numMap[0]];
                swap(numVec[zeroPos], numVec[secondPos]);
                numMap[numMap[0]] = zeroPos;
                numMap[0] = secondPos;
                ++count;
            }
        }
        cout << count << endl;
    }
}

求最大能做的价值数

// 100%
int CanDo(vector<int>& dayVec, int day)
{
    for ( auto i = day; i > 0; --i )
    {
        if ( dayVec[i] != 0 )
        {
            return i;
        }
    }
    return -1;
}
int main()
{
    int n;
    while ( cin >> n )
    {
        int sum = 0;
        vector<pair<int, int>> numVec(n);
        vector<int> dayVec = { 0,0,0,0,0,0,0,0,1,1,0,
            1,1,1,1,1,1,0,1,1,1,
            1,1,0,0,1,1,1,1,1,1,0 };

        for ( auto i = 0; i < n; ++i )
        {
            cin >> numVec[i].first >> numVec[i].second;
        }
        sort(numVec.begin(), numVec.end(), [](auto a, auto b)->bool{return a.first > b.first; });
        for ( auto i : numVec )
        {
            int doDay = CanDo(dayVec, i.second);
            if ( doDay != -1 )
            {
                sum += i.first;
                dayVec[doDay] = 0;
            }
        }
        cout << sum << endl;
    }
}

三星

饿了吃饭去了就没做~

#友塔游戏##笔经#
全部评论
最后一题想了个贪心没写完...
2 回复 分享
发布于 2022-03-17 20:16
大佬6
点赞 回复 分享
发布于 2022-03-17 20:09

相关推荐

11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
5
分享
牛客网
牛客企业服务