題目描述
棟棟正在和同學們玩一個數字游戲,
游戲的規則是這樣的:棟棟和同學們一共n個人圍坐在一圈,棟棟首先說出數字1,接下來,坐在棟棟左手邊的同學要說下一個數字2,再下面的一個同學要從上一個同學說的數字往下數兩個數說出來,也就是說4,下一個同學要往下數三個數,說7,依次類推,
為了使數字不至于太大,棟棟和同學們約定,當在心中數到 k-1 時,下一個數字從0開始數,例如,當k=13時,棟棟和同學們報出的前幾個數依次為:
1, 2, 4, 7, 11, 3, 9, 3, 11, 7,
游戲進行了一會兒,棟棟想知道,到目前為止,他所有說出的數字的總和是多少,
樣例說明
棟棟說出的數依次為1, 7, 9,和為17,
資料規模和約定
1 < n,k,T < 1,000,000;
輸入
輸入的第一行包含三個整數 n,k,T,其中 n 和 k 的意義如上面所述,T 表示到目前為止棟棟一共說出的數字個數,
輸出
輸出一行,包含一個整數,表示棟棟說出所有數的和,
樣例輸入
3 13 3
樣例輸出
17
解題思路
這道題方法其實挺多呃,但是要注意時間超限問題,所及找效率更高的方法
方法一的思路沒有問題,但是時間超限了,可以看方法二
先看代碼,思路后補
代碼如下
方法一
import java.util.ArrayList;
import java.util.Scanner;
/**
* 數字游戲
* @author hf
*
*/
public class Cyyw1443 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Long n = sc.nextLong();
int k = sc.nextInt();
Long T = sc.nextLong();
ArrayList<Integer> list = new ArrayList<Integer>();
int sum = 1;
// 先將規律的資料存入陣列中
list.add(1);
for (int i = 2; i < ((n*(T-1))+2); i++) {
list.add(list.get(i-2)+(i-1));
if (list.get(i-1) >= k) {
list.set(i-1, list.get(i-1)-k);
}
if (i % n == 0) {
sum += list.get(i-1);
}
}
sum += list.get(list.size()-1);
System.out.println(sum);
}
}
方法二
import java.util.Scanner;
/**
* 數字游戲
* @author hf
*
*/
public class Cyyw1443 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i = 1; //第幾次
long sum = 1,x,add = 1,n,k,T;
n = sc.nextLong();
k = sc.nextLong();
T = sc.nextLong();
while (i < T) {
x = add + ((i-1)*n + 1 + i*n)*n/2; // 得到這次這個人所報的數字
i++; // 過這個人的次數加1
x = x % k; //當大于k的部分需要回傳
sum += x; //數字和
add = x; // 回傳
}
System.out.println(sum);
}
}
運行示例

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/5836.html
標籤:其他
上一篇:以java語言為工具的粗糙的飛機大戰游戲的開發與實作
下一篇:演算法:給一個二叉樹,每個節點都有權值,你可以從這個樹的節點往下走,到任意節點停止,你得到的分數是走過路徑上的權值的異或和
