1.题目描述
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n< 55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
输出
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
样例输入
2
4
5
0
样例输出
2
4
6
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n==0)break;
int a,b,c,d; //分别代表一岁二岁三岁四岁及其以上的母牛的数目。
if(n<=4)cout<<n<<endl; //若n<=4,很容易得出总数为n
else{
n=n-4;
a=b=c=d=1;
for(int i=0;i<n;i++)
{
d=c+d;//当年大母牛数目d为前一年c和d的总和
c=b;//b母牛长了一岁到了c
b=a;//同上
a=d;//长成的母牛和原本的母牛共生出新的小母牛a个
}
cout<<a+b+c+d<<endl;
}
}
}
2.题目描述
相信大家小时候应该都玩过石子吧,现在有两个小孩正在玩一堆石子,他们用这些石子做一个游戏,游戏的规则是有一堆石子(n个石子),两人轮流取石子,每走一步可以取走1…m个石子,规定最先取光石子的一方为胜。现在,小孩们要你猜他们谁会赢,你能猜得出来吗?(假设两个小孩都足够聪明,都会选择最优的策略)
输入
输入数据首先包含一个正整数t(1≤t≤100),表示有t组测试数据。每组测试数据占一行,包含两个整数n和m(1≤n,m≤1000),n和m的含义见上面的描述。
输出
如果先走的小孩能赢,请输出“first”,否则请输出“second”,每个输出占一行。
样例输入
2
23 2
4 3
样例输出
first
second
代码:
#include<iostream>
using namespace std;
int main(){
intn[100], m[100];
intt = 0;
cin>> t;
inti = 0;
while(i<t){
cin>>n[i]>>m[i];
i+=1;
}
for(i= 0; i < t; ++i){
if((n[i]%(m[i]+1))== 0){
cout<<"second" << endl;
}
else{
cout<<"first"<<endl;
}
}
return0;
}
3. 题目描述
一个给定的子序列是在该序列中删去若干元素后得到的序列。例如,序列z=<B,C,D,B> 是序列X=<A,B,C,B,D,A,B>的子序列;
给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X,Y的公共子序列。
例如,若X=<A,B,C,B,D,A,B>,Y=<B,D,C,A,B,A>,
那么:<B,C,A>是X和Y的一个公共子序列,<B,C,B,A>也是X和Y的一个公共子序列;
编程求出给定的两个序列中,最长公共子序列的长度。
输入
共两行,各一个字符串,第一个字符串表示第一个序列,第二个字符串表示第二个序列,两个字符串长度均小于1000。
输出
一个整数,即两个序列的公共子序列的长度。
样例输入
aabaaecd
abcd
样例输出
4
// LCS.cpp : 定义控制台应用程序的入口点。
#include <string>
#include <vector>
#include <iostream>
using namespace::std;
int lcs(string str1, string str2,vector<vector<int>>& vec) {
intlen1 = str1.size();
intlen2 = str2.size();
vector<vector<int>>c(len1 + 1, vector<int>(len2 + 1, 0));
for(int i = 0; i <= len1; i++) {
for(int j = 0; j <= len2; j++) {
if(i == 0 || j == 0) {
c[i][j]= 0;
}
elseif (str1[i - 1] == str2[j - 1]) {
c[i][j]= c[i - 1][j - 1] + 1;
vec[i][j]= 0;
}
elseif (c[i - 1][j] >= c[i][j - 1]) {
c[i][j]= c[i - 1][j];
vec[i][j]= 1;
}
else{
c[i][j]= c[i][j - 1];
vec[i][j]= 2;
}
}
}
returnc[len1][len2];
}
int main()
{
stringstr1;
stringstr2;
cin>> str1;
cin>> str2;
vector<vector<int>>vec(str1.size() + 1, vector<int>(str2.size() + 1, -1));
intresult = lcs(str1, str2, vec);
cout<< result << endl;
getchar();
return0;
}
一个给定的子序列是在该序列中删去若干元素后得到的序列。例如,序列z=<B,C,D,B> 是序列X=<A,B,C,B,D,A,B>的子序列;
给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X,Y的公共子序列。
例如,若X=<A,B,C,B,D,A,B>,Y=<B,D,C,A,B,A>,
那么:<B,C,A>是X和Y的一个公共子序列,<B,C,B,A>也是X和Y的一个公共子序列;
编程求出给定的两个序列中,最长公共子序列的长度。
输入
共两行,各一个字符串,第一个字符串表示第一个序列,第二个字符串表示第二个序列,两个字符串长度均小于1000。
输出
一个整数,即两个序列的公共子序列的长度。
样例输入
aabaaecd
abcd
样例输出
4
// LCS.cpp : 定义控制台应用程序的入口点。
#include <string>
#include <vector>
#include <iostream>
using namespace::std;
int lcs(string str1, string str2,vector<vector<int>>& vec) {
intlen1 = str1.size();
intlen2 = str2.size();
vector<vector<int>>c(len1 + 1, vector<int>(len2 + 1, 0));
for(int i = 0; i <= len1; i++) {
for(int j = 0; j <= len2; j++) {
if(i == 0 || j == 0) {
c[i][j]= 0;
}
elseif (str1[i - 1] == str2[j - 1]) {
c[i][j]= c[i - 1][j - 1] + 1;
vec[i][j]= 0;
}
elseif (c[i - 1][j] >= c[i][j - 1]) {
c[i][j]= c[i - 1][j];
vec[i][j]= 1;
}
else{
c[i][j]= c[i][j - 1];
vec[i][j]= 2;
}
}
}
returnc[len1][len2];
}
int main()
{
stringstr1;
stringstr2;
cin>> str1;
cin>> str2;
vector<vector<int>>vec(str1.size() + 1, vector<int>(str2.size() + 1, -1));
intresult = lcs(str1, str2, vec);
cout<< result << endl;
getchar();
return0;
}