题目描述
1
1 1 1
1 2 3 2 1
1 3 6 7 6 3 1
1 4 10 16 19 16 10 4 1
以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数,左上角数到右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3。
输入n(n <= 1000000000)
输入描述:
输入一个int整数
输出描述:
输出返回的int值
示例1
输入
4
输出
3
方法1分析:一是找规律,前2行直接输出-1,奇数行输出2,能被4整除的行输出3,不能被4整除的输出4。
#include<iostream>
using namespace std;
int main(){
int n;
while (cin >> n){
if (n < 3) cout << -1 << endl;
else if (n % 2 == 1) cout << 2 << endl;
else if (n % 4 == 0) cout << 3 << endl;
else cout << 4 << endl;
}
return 0;
}
方法2分析:老老实实的把每一行求出来,我们发现每一行的前两个是直接知道的,第三个到倒数第三个等于上一行正对应的连续3个数之和。
#include<iostream>
#include <vector>
using namespace std;
inline int index(int n){
vector<vector<int>> res;
res.push_back(vector<int>(1, 1)); //添加第一行;
res.push_back(vector<int>(3, 1)); //添加第二行;
for (int i = 2; i < n; ++i){ //第i行的第二个和倒数第二个为i,从第三行开始;
vector<int> temp(2*i + 1, 1);
temp[1] = temp[i * 2 - 1] = i;
res.push_back(temp);
}
for (int i = 2; i < n; ++i){ //求第i行的第三个到倒数第三个,从第三行开始;
for (int j = 2; j < 2 * i - 1; ++j)
res[i][j] = res[i - 1][j - 2] + res[i-1][j-1] + res[i-1][j];
}
for (int i = 0; i < n; ++i)
if (res[n - 1][i] % 2 == 0) return i+1;
return -1;
}
int main(){
int n,k;
while (cin >> n) cout<<index(n) << endl;
return 0;
}