ACM_棋棋棋棋棋(规律题)
Posted 霜雪千年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM_棋棋棋棋棋(规律题)相关的知识,希望对你有一定的参考价值。
棋棋棋棋棋
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_棋棋棋棋棋(规律题)的主要内容,如果未能解决你的问题,请参考以下文章