2019.4.7晚—腾讯技术研究类笔试编程题全解答

Problem1:  输入两个数N,K。规定每一轮操作二选一, A: 所有数都减1;B: 所有数中把一个数拆分为两数之和,输入的初始数为N,总的拆分次数为K(这里注意,按照题目如果在一轮中拆了2个数,则次数算2),直到所有数为0, 计算所需轮数。  

举例:

输入:9  3

 输出:5  

第一轮:拆9  变为【4,5】 ; 第二轮:拆5和4,变为【2,3,2,2】;第三轮:因为已经拆过3次了所以只能减,也就是减3次

最后拆2轮,减3轮,所需轮数为5轮。

#include <iostream>
#include <set>
#include <algorithm>
#include <cmath>

using namespace std;

int main ()
{
    int n, k;

    while( cin >> n >>k )
    {
        multiset<int, greater<int> > s;   //按照降序排列
        s.insert(n);
        int splitLayer = 0, num = 0;
        //cout << *s.begin() << endl;
        for(int i= 0; i < k; ++i )
        {
            num += pow(2, i);
            if( num >= k)
            {
                splitLayer = i + 1;
                break;
            }
        }

        while(k--)
        {
            int tmp = *s.begin();
            s.erase( s.begin() );
            s.insert( tmp / 2 );
            s.insert( tmp - tmp / 2 );
        }

        int great = *s.begin();
        int ans = splitLayer + great;
        cout << ans << endl;
    }

    system("pause");
    return 0;
}


 Problem2: 输入N,表示数组的大小,再输入数组中的每一个数。N个村庄,若第i个数为正数a[i],表示该村庄需要卖出a[i]个苹果,如果为负数,表示需要购入a[i]个苹果。 将K个苹果运往相邻的村庄运费为K,求最终所有村庄平衡后(全为0),需要运费多少。 

输入:

5 -3 1 1 -4  

输出:

14    

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

int main ()
{
    int n;     //村庄的数量
    cin >> n;
    vector<int> vec(n);
    for( int i=0; i < n; ++i)
        cin >> vec[i];

    //cout << *vec.begin() << endl;

    int p1, p2;  //p1 指向第一个负数 p2指向第一个正数
    int res = 0;
    bool needMove = true;

    while( needMove  )
    {
        needMove = false;   //注意这里是修改全局变量

        for(int i=0; i < n; ++i)
        {
            if(vec[i] < 0)
            {
                p1 = i;  needMove = true;
            }
            if(vec[i] > 0)
            {
                p2 = i;  needMove = true;
            }
        }

        if( abs(vec[p1]) >= abs(vec[p2]) )  // 如果负数的绝对值大
        {
            res += abs( vec[p2] ) * abs( p1 - p2 );
            vec[p1] = vec[p1] + vec[p2];
            vec[p2] = 0;

        }
        else
        {
            res += abs( vec[p1] ) * abs( p1 - p2 );
            vec[p2] = vec[p1] + vec[p2];
            vec[p1] = 0;
        }
    }

    cout << "you need move:" << res << endl;
    return 0;

}

 

Problem3: 输入N,K。N表示数组大小,然后输入数组中的数。  一个数组每次输出数组中最小的数,然后其他数减去这个最小数,重复这个过程K次。 其中 0<N, K <10^5,   0< a[i] < 10^9

举例:

输入:

4 3 

2 6 4 3  

输出:

1

1

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

int main ()
{
    int n, k;
    cin >> n >> k;

    vector<long long> arr(n);
    for(int i=0; i<n; ++i)
    {
        cin >> arr[i];
    }

    int i=0, j=0;
    cout << endl << "the expected output:" << endl;
    while(k--)
    {
        sort(arr.begin() + i, arr.end());   //降序
        long long tmp = arr[i];
        cout << tmp << endl;
        i++;

        for( j = i; j < n; ++j )
        {
            arr[j] -= tmp;
        }
    }

    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值