腾讯2019实习面试题

1. 题目一:数列极差问题

小Q的好朋友牛牛在纸上写了长度为n的正整数数列。牛牛要求小Q每次从数列中选取两个数a,b,把这两个数从数列中移除出去,然后在数列中加入a * b + 1,直到只剩一个数为止。小Q发现根据操作顺序的不同,最后得到的数的大小也不一样。小Q现在想让你帮他计算,在所有情况中能获得的最大值减去能获得的最小值等于多少?

输入:
3
1
2
3
输出:
2

解题方法:

第一步:先要对你输入的一个数组进行排序

第二步:擦掉最大的两个数,然后插入a*b+1 继续擦掉最大的两个数,最终得到最大值。

第三步:擦掉最大的两个数,然后插入a*b+1继续擦掉最小的两个数,最终得到最小值。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int main(){
 7     int n;
 8     int num[1000];
 9     while(scanf("%d", &n) != EOF){
10         for(int i=0; i<n; ++i)
11             scanf("%d", &num[i]);
12         sort(num, num+n);
13         if(n<3){
14             printf("%d\n", 0);
15             continue;
16         }
17         int min = num[n-1];
18         for(int i=0; i<n-1; ++i){
19             min = min * num[n-2-i] + 1;
20         }
21 
22         int max = num[0];
23         for(int i=1; i<n; ++i){
24             max = max * num[i] + 1;
25         }
26         printf("%d\n", max-min);
27     }
28     return 0;
29 }

2. 题目二:自增数组

小Q发现了一种特殊的数组,叫做自增数组。这个数组支持一种操作:每次操作可以把数组中一个数自增1。现在有一个长度为n的自增数组,小Q现在想利用这个操作把数组中的每个数都变得不一样,请问你最少需要多少次操作?

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
    int n = 0;
    vector<int> array;
    cin>>n;
    int t;
    for(int i=0 ;i<n; ++i){
        cin>>t;
        array.push_back(t);
    }
    vector<int> cf;
    sort(array.begin(), array.end());
    for(int i=1; i<n; ++i){
        if(array[i] == array[i-1])
            cf.push_back(array[i]);
    }
    int len = max(n+1, array[n-1]+1);
    vector<int> arr(len,0);
    for(int i=0; i<n; ++i){
        arr[array[i]] = array[i];
    }
    int idx=0;
    int cnt=0;
    for(int i=1; i<len; ++i){
        if(arr[i] == 0){
            cnt += i - cf[idx];
            idx++;
            if(idx == cf.size())
                break;
        }
    }
    cout<<cnt;
}

 

posted @ 2019-06-01 17:43  Longice  阅读(724)  评论(0编辑  收藏  举报