码迷,mamicode.com
首页 > 其他好文 > 详细

2018腾讯笔试题

时间:2019-08-19 13:04:37      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:整数   final   long   连续   sum   case   结束   符号   不同   

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

import java.util.Scanner;
public class Main{
   public static void main(String[] args){
       Scanner s = new Scanner(System.in);
       int n = s.nextInt();
       int m = s.nextInt();
       Long sum = 0L;
       int flag = 1;
       for(int i = 1; i <= n; i++){
           if(flag <= m){
               sum = sum - (int)i;
           }
           else if(flag > m && flag <= 2*m){
               sum = sum + (int)i;
           }
           if(flag == 2*m){
               flag = 0;
           }
           flag = flag + 1;
            
       }
       System.out.println(sum);
        
   }
}
过了90%的case,数字过大会超时=。=
看别人的正确答案都是直接算 m*n/2;这原来是数学题么!

 

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

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int a[]  = new int[n];
        for(int i = 0; i < n; i++){
            a[i] = sc.nextInt();
        }
        Arrays.sort(a);
        Long sum = 0L;
        int jishu = 0;
        for(int i = n-1; i >= 0; i--){
            if(jishu == 0){
                sum = sum + (int)a[i];
                jishu = -1;
            }
            else{
                sum = sum - (int)a[i];
                jishu = 0;
            }
        }
        System.out.println(sum);
       
    }
}

 

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

import java.util.Scanner;
public class Main{
   
   //算第一天吃f块时,吃n天需要总量是多少。
    public static int minCho(int f, int n){
        int minCho = 0;
        for(int i = 0; i < n; i++){
            
            if(f >= 2){
                minCho = minCho + f;
                if(f%2 == 0){
                    f=f/2;
                }
                else{
                    f=f/2 + 1;
                }
            }
            else{
                minCho = minCho + 1;
            }
        }
        return minCho;
    }
    
    public static void main(String[] args){
       Scanner s = new Scanner(System.in);
       int n = s.nextInt();
       int m = s.nextInt();
       int i = m;
       for(; i >= 1; i--){
           if(minCho(i, n) <= m){
               break;
           }
       }
       System.out.println(i);
   }
}

 

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

首先一个数学知识:C(m,n)=m!/[(m-n)!n!]

 

- -虽然做出来了不过只能过40%的case。。。数字有点大。

抄了一份别人的

import java.util.*;
 
public class Main{
    public static final int ASD = 1000000007;
     
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int k=sc.nextInt();
        int a=sc.nextInt(), x=sc.nextInt();
        int b=sc.nextInt(), y=sc.nextInt();
        int[] dp = new int[k+1];
        dp[0] = 1;
        for(int i=0; i<x ; i++){
            for(int j=k; j>=a; j--){
                dp[j] = (dp[j] + dp[j-a]) % ASD;
            }
        }
         
        for(int i=0; i<y ; i++){
            for(int j=k; j>=b; j--){
                dp[j] = (dp[j] + dp[j-b]) % ASD;
            }
        }
         
        System.out.println(dp[k]);
        sc.close();
    }
}

 

 

采用了背包问题的解决思路。

之前没接触过,专门研究一下;

 

2018腾讯笔试题

标签:整数   final   long   连续   sum   case   结束   符号   不同   

原文地址:https://www.cnblogs.com/clamp7724/p/11376286.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!