2018腾讯春招笔试题(4月5日)

题目一 翻转数列

题目描述

小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<=10^9, 1 <= m),并且满足n能被2m整除。

输出描述:

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

示例

输入

8 2

输出

8

代码

# include
# include
# include
# include
using namespace std;

int main(){
    long long n, m;
    while(cin>>n>>m){
        long long result = (n >> 1) * m;
        cout<

题目二 小Q的歌单

题目描述

小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌。现在小Q想用这些歌组成给一个总长度为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌曲的先后顺序的情况下,请问有多少种组成歌单的方法?

输入描述

每个输入包含一个测试用例。
每个测试用例的第一行包含一个整数,表示歌单的总长度K(1<=K<=1000)。
接下来的一行包含四个正整数,分别表示歌的第一种长度A(A<=10)和数量X(X<=100)以及歌的第二种长度B(B<=10)和数量Y(Y<=100)。保证A不等于B。

输出描述

输出一个整数,表示组成歌单的方法取模。因为答案可能会很大,输出1000000007取模的结果。

示例

输入

5
2 3 3 3

输出

9

40%代码

#include
#include
#include
#include

using namespace std;
int num = 0;

void deal_sum(vector<int>a, int n, int val)
{
    int count = 1;
    int m = n;
    vector<int>b(n,0);
    while (m--)
         count *= 2;

    while (count--){
         for (int i = 0; iif (0 == b[i])
                 b[i] = 1;
             else
             {
                 b[i] = 0;
                 break;
             }
         }
         int sum = 0;
         for (int i = 0; iif (b[i] == 1)
                 sum += a[i];
         }
         if (sum == val)
         {
             num++;
         }
    }
}
int main() {
    vector<int> arr;
    int K;
    cin >> K;
    int A, X, B, Y;
    cin >> A >> X >> B >> Y;
    for (int i = 0; ifor (int i = 0; icout << num%1000000007;
}

题目三 安排机器

题目描述

小Q的公司最近接到m个任务,第i个任务需要x的时间去完成,难度等级为yi。
小Q拥有n台机器,每台机器最长工作时间zi,机器等级wi。
对于一个任务,它只能交由一台机器来完成。如果安排给它的机器的最长工作时间小于任务需要的时间,则不能完成。如果完成这个任务将获得200*xi+2*yi 收益。
对于一台机器,它一天只能完成一个任务,如果它的机器等级小于安排给它的任务难度等级。则不能完成。
小Q想在今天尽可能的去完成任务,即完成的任务数量最大。如果有多种安排方案,小Q还想找到收益最大的那个方案。小Q需要你来帮助他计算一下。

输入描述

输入包括 N+M+1 行
输入的第一行为两个正整数n和m(1<=n,m<=100000),表示机器的数量和任务的数量。

你可能感兴趣的:(笔试题)