2018腾讯秋招笔试题

题目来源:牛客网

1. 翻转数列

在这里插入图片描述

解题思路:

这道题目非常简单,可以设置一个flag变量,用来控制符号的编号,然后循环累计就可以得到结果。

AC代码:
#include <stdio.h>

int main(){
    int n, m;
    scanf("%d %d", &n, &m);
    long long sum = 0;
    int flag = -1;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++)
            sum += (flag * i);
        flag *= -1;
    }
    printf("%lld\n", sum);
    return 0;
}

2. 纸牌游戏

在这里插入图片描述

解题思路:

贪心算法,每个人每次都是抽当前数字最大的纸牌,因此只需要将数组进行排序,然后模拟两个人依次抽纸牌,将第二个人抽的纸牌数字乘上-1,进行累加即可得到结果。

AC代码:
#include <stdio.h>
#include<algorithm>
using namespace std;

bool compare1(int a, int b){return a > b;}

int main(){
    int n;
    scanf("%d", &n);
    int card[n];
    for(int i = 0; i < n; i++){
        scanf("%d", &card[i]);
    }
    sort(card, card + n, compare1);
    int flag = -1, sum = 0;
    for(int i = 0; i < n; i++){
        flag *= -1;
        sum += card[i] * flag;
    }
    printf("%d\n", sum);
    return 0;
}

3.贪吃的小Q

在这里插入图片描述

解题思路:

二分查找,需要注意的是,第二天吃的巧克力数量不少于第一天的一半,需要进行处理,否则前一天吃的巧克力是奇数的情况下会出现问题,比如前一天吃了19块巧克力,那么第二天至少吃10块巧克力,而不是19/2=9块巧克力。在程序中用了对2取余是否等于0来处理这种情况。

AC代码:
#include <stdio.h>

int sum(int mid, int n){
    int sum = 0;
    for(int i = 0; i < n ; i++){
        sum += mid;
        mid = mid % 2 == 0? mid / 2: mid / 2 + 1;
    }
    return sum;
}

int find(int n, int m){
    int l = 1, h = m;
    while(l <= h){
        int mid = (l + h) / 2;
        if(sum(mid, n) == m) return mid;
        else if(sum(mid, n) > m) h = mid - 1;
        else l = mid + 1;
    }
    return h;
}

int main(){
    int n, m;
    scanf("%d %d", &n, &m);
    int ans = find(n, m);
    printf("%d\n", ans);
    return 0;
}

4.小Q的歌单

在这里插入图片描述

解题思路:

组合问题

AC代码:
include <stdio.h>

long long c[105][105];
int mod = 1000000007;

void init(){
    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]) % mod;
        }
    }
}

int main(){
    int k;
    scanf("%d", &k);
    int a, x, b, y;
    scanf("%d %d %d %d", &a, &x, &b, &y);
    long long ans = 0;
    init();
    for(int i = 0; i <= x; i++){
        if(i*a <= k && (k-i*a)%b == 0 && (k-i*a)/b <= y){
            ans = (ans + (c[x][i] * c[y][(k - i * a) / b]) % mod) % mod;
        }
    }
    printf("%lld\n", ans);
    return 0;
}

5.安排机器

在这里插入图片描述

6.画家小Q

在这里插入图片描述
在这里插入图片描述

解题思路:

遍历每次遇到Y或者B,把对应斜线上的所有颜色改成X,次数加一;遇到G时,分别朝斜率为+1和-1方向将斜线上的Y或者B改为X,次数加二。

AC代码:
#include <iostream>
using namespace std;
int r, c;
char color[55][55];

void changeB(int p, int q){
    while(p != r && q != -1){
        if(color[p][q] == 'B') color[p][q] = 'X';
        else if(color[p][q] == 'G') color[p][q] = 'Y';
        else break;
        p++; q--;
    }
}

void changeY(int p, int q){
    while(p != r && q != c){
        if(color[p][q] == 'Y') color[p][q] = 'X';
        else if(color[p][q] == 'G') color[p][q] = 'B';
        else break;
        p++; q++;
   }
}

int main() {
    cin >> r >> c;
    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++)
            cin >> color[i][j];
    }
    int count = 0;
    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++){
            if(color[i][j] == 'Y'){
                int p = i + 1, q = j + 1;
                color[i][j] = 'X';
                changeY(p, q);
                count++;
            }else if(color[i][j] == 'B') {
                int p = i + 1, q = j - 1;
                color[i][j] = 'X';
                changeB(p, q);
                count++;
            }else if(color[i][j] == 'G'){
                color[i][j] = 'X';
                changeY(i+1, j+1);
                changeB(i+1, j-1);
                count += 2;
            }
        }
    }
    cout << count << endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值