1. 程式人生 > >ACM_棋棋棋棋棋(規律題)

ACM_棋棋棋棋棋(規律題)

for input 參加 using 當前 () 由於 棋盤 很多

棋棋棋棋棋

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

在遙遠的K次元空間,一年一度的GDUFE-GAME又開始了。每年的GDUFE-GAME都會有很多有趣的小遊戲吸引學生參加,但是由於時間和參與人數有限制,導致很少有學生能參與所有的遊戲,於是智力(障)超群的QWER下定決心要盡可能多參與到不同的遊戲中。為了實現這個小目標,QWER要盡快通過進場必玩的棋盤遊戲。
這個棋盤遊戲的規則是這樣子的:在一個n行n列的黑白相間棋盤上放棋子,要求放下去的棋子的相鄰位置不能再放棋子,也就是說,如果有棋子放在(i, j)位置,那麽(i-1, j), (i, j-1), (i, j+1), (i+1, j)這四個位置都不能放棋子,顯然對於每個棋盤最多能放的棋子數是確定的,當棋盤上棋子達到上限即通過遊戲。
這個問題難不倒QWER,但是為了盡快通過遊戲,QWER想一次性拿起所有的棋子放完,但是他該拿多少呢......

Input:

第一行是一個整數 T,代表總共有 T 個測試實例。
每個測試實例包含一個整數 n (1 ≤ n ≤ 65535),代表棋盤大小為 n 行 n 列。

Output:

對於每個測試實例,輸出一個整數,代表QWER應該一次性拿起多少棋子。(答案保證在int範圍內)

Sample Input:

2
1
2

Sample Output:

1
2
解題思路:這是一道找規律的題目,比較簡單,容易推導。假設a[i]存放當前棋盤(按規則)最多能容納的棋子數,則規律如下:
a[1]=1;
a[2]=2;
a[3]=5(-->3+a[2]);
a[4]=8(-->4*2);
a[5]=13(-->5+a[4]);
a[6]=18(-->3*6);
...
很容易發現,當i是奇數時,a[i]=i+a[i-1];當i是偶數時,a[i]=i*k;(當i=2時,k=1;之後每遇到偶數遞增1,再執行a[i]=i*k即可)。
AC代碼:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[65540],k=1;
 4 int main()
 5 {
 6     a[1]=1,a[2]=2;
 7     for(int i=3;i<65540;++i){
 8         if(i%2)a[i]=i+a[i-1];
 9         else{
10             ++k;
11             a[i]=k*i;
12         }
13     }
14     int T,n;
15     cin>>T;
16 while(T--){ 17 cin>>n; 18 cout<<a[n]<<endl; 19 } 20 return 0; 21 }
 

ACM_棋棋棋棋棋(規律題)