腾讯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项和为多少。

#include
using namespace std;
int main()
{
    long long n, m;
    while(cin >> n >> m)
    {
        cout << m*m*(n/(2*m)) << endl;
    }
    return 0;
}

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

#include
#include
using namespace std;
int main()
{
    int n;
    cin >> n;
    int a[n];
    for(int i=0;i> a[i];
    }
    sort(a,a+n);
    int N = 0, Y = 0;
    for(int i=n-1;i>=0;i-=2)
    {
        N += a[i];
        if(i-1 >= 0)
            Y += a[i-1];
    }
    cout << N - Y << endl;
    return 0;
}

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

#include
using namespace std;
int N, M;
int getSum(int m)
{
    int sum = 0;
    for(int i=0;i> N >> M)
    {
        int l = 1;
        int r = M;
        while(l

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

#include
using namespace std;
int main()
{
    long long C[105][105];
    C[0][0] = 1;
    for(int i=1;i<=100;i++)
    {    
        C[i][0] = 1;
        for(int j=1;j<=100;j++)
            C[i][j] = (C[i-1][j-1] + C[i-1][j])%1000000007;
    }
    int K, A, X, B, Y ;
    while(cin >> K >> A >> X >> B >> Y)
    {
        long long sum = 0;
        for(int i=0;i<=X;i++)
        {
            for(int j=0;j<=Y;j++)
            {
                if((A*i + B*j) > K)
                    break;
                if((A*i + B*j) == K)
                    sum += C[X][i]*C[Y][j]%1000000007;
            }
        }
        cout << sum%1000000007 << endl;
    }
    return 0;
}

5.小Q的公司最近接到m个任务, 第i个任务需要xi的时间去完成, 难度等级为yi。
小Q拥有n台机器, 每台机器最长工作时间zi, 机器等级wi。
对于一个任务,它只能交由一台机器来完成, 如果安排给它的机器的最长工作时间小于任务需要的时间, 则不能完成,如果完成这个任务将获得200 * xi + 3 * yi收益。

对于一台机器,它一天只能完成一个任务, 如果它的机器等级小于安排给它的任务难度等级, 则不能完成。

小Q想在今天尽可能的去完成任务, 即完成的任务数量最大。如果有多种安排方案,小Q还想找到收益最大的那个方案。小Q需要你来帮助他计算一下。

#include 
using namespace std;
#define LL long long
const int maxn = 1e5 + 10;
struct node 
{
    int x,y;
}e[maxn],f[maxn];
int cnt[105];
int cmp(node a ,node b)
{
    if(a.x == b.x)
        return a.y > b.y;
    return a.x > b.x;
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i = 0;i < n;i++)
        scanf("%d%d",&e[i].x,&e[i].y);
    for(int i = 0;i < m;i++)
        scanf("%d%d",&f[i].x,&f[i].y);
    sort(e,e + n,cmp);
    sort(f,f + m,cmp);
    int num = 0;
    LL ans = 0;
    memset(cnt,0,sizeof(cnt));
    int i,j,k;
    for(i = 0,j = 0;i < m;i++){
        while(j < n && e[j].x >= f[i].x)
        {
            cnt[e[j].y]++;
            j++;
        }
        for(k = f[i].y;k <= 100;k++)
        {
            if(cnt[k]){
                num++;
                cnt[k]--;
                ans = ans + 200 * f[i].x +3 * f[i].y;
                break;
            }
        }
    }
    printf("%d %lld\n",num,ans);
    return 0;
}

6.画家小Q又开始他的艺术创作。小Q拿出了一块有NxM像素格的画板, 画板初始状态是空白的,用'X'表示。
小Q有他独特的绘画技巧,每次小Q会选择一条斜线, 如果斜线的方向形如'/',即斜率为1,小Q会选择这条斜线中的一段格子,都涂画为蓝色,用'B'表示;如果对角线的方向形如'\',即斜率为-1,小Q会选择这条斜线中的一段格子,都涂画为黄色,用'Y'表示。
如果一个格子既被蓝色涂画过又被黄色涂画过,那么这个格子就会变成绿色,用'G'表示。
小Q已经有想画出的作品的样子, 请你帮他计算一下他最少需要多少次操作完成这幅画。

#include
using namespace std;
unsigned char canvas[55][55];
int n, m;
int checkAndClear(unsigned char cmp, int slope, int i, int j)
{
    int flag = 0;
    do
    {
        if(canvas[i][j] & cmp)
        {
            canvas[i][j] &= ~cmp;
            ++i, j += slope, flag = 1;
        }
        else
            return flag;
    }while(i=0 && j=0);
    return flag;
}
int main()
{
    while(cin >> n >> m)
    {
        for(int i=0;i> str;
            for(int j=0;j

 

你可能感兴趣的:(基础算法,公司真题)