ACM_棋棋棋棋棋(規律題)
阿新 • • 發佈:2018-04-12
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_棋棋棋棋棋(規律題)