騰訊算法題彙總[牛客網過騰訊春招題所有測試用例](上)

  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

	public class RuleCount {
	
	    public static void main (String[] args) {
	        Scanner sc = new Scanner(System.in);
	        long n = sc.nextLong();
	        long m = sc.nextLong();
	
	        System.out.println(n*m/2);
	
	
	    }
	
	}
  1. 牛牛和羊羊正在玩一個紙牌遊戲。這個遊戲一共有n張紙牌, 第i張紙牌上寫着數字ai。
    牛牛和羊羊輪流抽牌, 牛牛先抽, 每次抽牌他們可以從紙牌堆中任意選擇一張抽出, 直到紙牌被抽完。
    他們的得分等於他們抽到的紙牌數字總和。
    現在假設牛牛和羊羊都採用最優策略, 請你計算出遊戲結束後牛牛得分減去羊羊得分等於多少。

輸入描述:
輸入包括兩行。
第一行包括一個正整數n(1 <= n <= 105),表示紙牌的數量。
第二行包括n個正整數ai(1 <= ai <= 109),表示每張紙牌上的數字。

輸出描述:
輸出一個整數, 表示遊戲結束後牛牛得分減去羊羊得分等於多少。

輸入例子1:
3
2 7 4

輸出例子1:
5

	import java.util.*;
	
	public class DrawCard {
	
	    public static void main (String[] args){
	        Scanner sc = new Scanner(System.in);
	        int times = sc.nextInt();
	        long[] arr = new long[times];
	
	        while( times > 0) {
	            arr[times-1] = sc.nextLong();
	            times--;
	        }
	
	        Arrays.sort(arr);
	
	        long res = 0;
	        long gum = 1;
	        int i = arr.length-1;
	        while (i > -1) {
	
	            res += gum * arr[i];
	            gum *= -1;
	            i--;
	        }
	
	        System.out.println(res);
	
	
	    }
	
	
	}
  1. 小Q的父母要出差N天,走之前給小Q留下了M塊巧克力。小Q決定每天吃的巧克力數量不少於前一天吃的一半,但是他又不想在父母回來之前的某一天沒有巧克力吃,請問他第一天最多能吃多少塊巧克力

輸入描述:
每個輸入包含一個測試用例。
每個測試用例的第一行包含兩個正整數,表示父母出差的天數N(N<=50000)和巧克力的數量M(N<=M<=100000)。

輸出描述:
輸出一個數表示小Q第一天最多能吃多少塊巧克力。

輸入例子1:
3 7

輸出例子1:
4

import java.util.Scanner;

public class EatCho {

    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        int days = sc.nextInt();
        int count = sc.nextInt();


        if (days <= 1 || days > count){
            System.out.println(count);
            return;
        }

        //推測理想情況下,次日吃的數量都是前一天的1/2,則得到以下求第一天最大塊數公式:
        //分子爲2的n次冪
        //分母爲等比數列 a1 *(1-q的n次冪)/(1-q)
//        int high = (int)(Math.pow(2, days-1)/ (Math.pow(2, days) - 1) * count);
// 最多第一天吃的塊數(因爲測試用例太大,導致上面的數學優化不能使用,只能從count-1開始)
        int high = count-1;
        int low = 1;//最少第一天吃1塊
        int tar = high;

        //採用折半查找
        while (low <= high) {

            int mid = (low + high)/2;
            int sum = count - mid;//第二天起剩餘的塊數
            int tmp = mid;
            int i = 2;
            for (; i <= days; i++){
                tmp = (int)Math.ceil(tmp/2.0);//用於記錄今天最少吃的數量
                sum -= tmp;
                if (sum < 0){
                    //表明不夠吃了情況
                    break;
                }
            }

            if (i < days)//供過於求
                high = mid - 1;
            else {


                if (sum < 0)//供不應求
                    high = mid - 1;

                else{
                    low = mid + 1;
                    tar = mid;
                }
            }



        }

        System.out.println(tar);




    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章