杭电oj平台上的11页题目代码:acm编程题:hdu1021 ,hdu1022,hdu1023

//1021
//思路:求出各个fn,再挨个判断其是否能被3整除.
#include<iostream>
using namespace std;
#define N 1000000
int f[N];
int main()
{
int n;
int i;
f[0] = 1;//%3的结果
f[1] = 2;//也是%3的结果
//注意:如果不直接先%3的话,提交以后就会wrong answer
for ( i = 2; i < N; i++)
{
f[i] = (f[i - 1] + f[i - 2])%3;
}
while (cin>>n)
{
if (f[n]==0)
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
}
return 0;
}


//1022
/*思路:类似进栈出栈.题目的意思就是共有n个数,前一个序列是s1,后一个序列是s2,
按照s1的顺序进栈(但是不一定是一次性进栈),看其出栈是否能够得到s2的顺序。
具体操作的步骤:将s1的字符一个个进栈,每进去一个,则相应的f的某个元素置为1,代表是进栈操作,然后比较此时的栈顶和s2的当前元素是否相等,如果相等,则将f的对应的元素置为0,代表出栈操作,则继续操作,j++,如果到最后j和n相等,则说明yes;如果不相等则继续前面的操作,直到i到n-1,
要想得到和s2的顺序,则出栈之前要和s2当前的元素(就是还没有比较过的元素)比较,
如果相等则出栈,如果不相等则继续寻找,一直到栈空。

*/
#include<stack>
#include<iostream>
using namespace std;
int main()
{
char s1[100], s2[100];
int n;
int i;
int k;
int j;
stack<char>s;
int f[100];//用来记录进出栈,若是1,则代表进栈操作,若是0,则代表出栈操作
while (cin>>n>>s1>>s2)
{
while (!s.empty())//开始操作之前要先清空栈
{
s.pop();
}
memset(f, -1, sizeof(f));
k = 0;
j = 0;
for ( i = 0; i < n; i++)
{
s.push(s1[i]);
f[k++] = 1;
while (!s.empty()&&s.top()==s2[j])
{
f[k++] = 0;
s.pop();
j++;
}
}
if (j==n)
{
cout << "Yes." << endl;
for ( i = 0; i < k; i++)
{
if (f[i])
{
cout << "in" << endl;
}
else
{
cout << "out" << endl;
}
}
}
else
{
cout << "No." << endl;
}
cout << "FINISH" << endl;
}

return 0;
}

//1023,卡特兰数的函数(c++),参考百度百科

一生有所追!
原文地址:https://www.cnblogs.com/BlueBlue-Sky/p/8531083.html