友塔-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

相关推荐

offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
点赞 5 评论
分享
牛客网
牛客企业服务