- 小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);
}
}
- 牛牛和羊羊正在玩一個紙牌遊戲。這個遊戲一共有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);
}
}
- 小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);
}
}