刷题刷题-腾讯

腾讯2018春招技术类编程题汇总

1、题目:

小Q定义了一种数列称为翻转数列:
给定整数n和m, 满足n能被2m整除。对于一串连续递增整数数列1, 2, 3, 4..., 每隔m个符号翻转一次, 最初符号为'-';。
例如n = 8, m = 2, 数列就是: -1, -2, +3, +4, -5, -6, +7, +8.
而n = 4, m = 1, 数列就是: -1, +2, -3, + 4.
小Q现在希望你能帮他算算前n项和为多少。 

输入描述:

输入包括两个整数n和m(2 <= n <= 109, 1 <= m), 并且满足n能被2m整除。

输出描述:

输出一个整数, 表示前n项和。

输入例子1:

8 2

输出例子1:

8

这个题是上周腾讯模拟考的时候我遇到的原题。。。。

就是一个数学题,前n项的和就是  n/2*m  ,注意有的测试用例比较大,所以把结果设置成 long  long 。题目还是很简单的,代码如下:

#include<iostream>

void init(){
    long long n=0,m=0;
    std::cin>>n>>m;
    std::cout<<n/2*m;
}
int main(){
    init();
    return 0;
}

2、题目:

牛牛和羊羊正在玩一个纸牌游戏。这个游戏一共有n张纸牌, 第i张纸牌上写着数字ai。
牛牛和羊羊轮流抽牌, 牛牛先抽, 每次抽牌他们可以从纸牌堆中任意选择一张抽出, 直到纸牌被抽完。
他们的得分等于他们抽到的纸牌数字总和。
现在假设牛牛和羊羊都采用最优策略, 请你计算出游戏结束后牛牛得分减去羊羊得分等于多少。

输入描述:

扫描二维码关注公众号,回复: 3897640 查看本文章
输入包括两行。
第一行包括一个正整数n(1 <= n <= 105),表示纸牌的数量。
第二行包括n个正整数ai(1 <= ai <= 109),表示每张纸牌上的数字。

输出描述:

输出一个整数, 表示游戏结束后牛牛得分减去羊羊得分等于多少。

输入例子1:

3
2 7 4

输出例子1:

5

把输入的数组快速排序,然后依次计算即可,也不难。代码如下:

#include<iostream>
#include<vector>
#include<algorithm>

void init(){
    int n=0, temp=0, answer=0;
    std::cin >> n;
    std::vector<int>container;
    while(n--){
        std::cin>>temp;
        container.push_back(temp);
    }
    sort(container.begin(),container.end());
    if(container.size()%2==0){
        for(int i=container.size()-1;i>=0;i-=2){
            answer=answer+container[i]-container[i-1];
        }
    }else{
        for(int i=container.size()-1;i>0;i-=2){
            answer=answer+container[i]-container[i-1];
        }
        answer=answer+container[0];
    }
    std::cout<<answer;
}
int main(){
    init();
    return 0;
}

3、题目:

小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力 

输入描述:

每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。

输出描述:

输出一个数表示小Q第一天最多能吃多少块巧克力。

输入例子1:

3 7

输出例子1:

4

思路:要求后一天的巧克力数量不能少于前一天的二分之一。即:保证前一天的巧克力数量是后一天数量的二倍,当刚好凑满m块巧克力时,即为最优解。因此,采用二分查找法,找到第一天所能吃的巧克力数量的最优解。

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
 
int n,m;
 
int getsum(int a){//第一天是a 
	int sum = 0;
	for(int i=0;i<n;i++){
		sum += a;
		a = (a+1)/2;//向上取整 
	} 
	return sum;
}
 
int main(){
	cin>>n>>m;	
	
	int low = 1,high = m,mid;//所以采用二分查找,时间复杂度到O(logn) 
	while(low <= high){
		mid = (low+high)/2;
		if(getsum(mid) == m){
			cout<<mid<<endl;
			return 0;
		}	
		else if(getsum(mid) > m)
			high = mid - 1;
		else
			low = mid + 1;
	}
	cout<<high<<endl;
			
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_29996285/article/details/82687260