1209: 模拟出入栈游戏
PIPI现有a-z 26个小球模拟出入栈操作,小球按照a~z的顺序压入栈,在栈顶的元素可以随时被取出,在游戏开始前给出任意26个字母的一些排列,问是否能够由出栈顺序得到这个排列。
- 关键点:要使出栈序列有效,任意数A后面比A小的数都是按照降序排列的
Problem :有六个元素{1,2,3,4,5,6},按照该顺序入栈,那么543216和542136哪个是合法的出栈序列?
发现入栈顺序是升序排列,快速判断的依据就是任意数A后面比A小的数都是按照降序排列的
- 543216中,5后面比5小的有4321,在543216中的确是按照降序的,其他的位也能以此判断,所以543216是合法的;
- 542136中,4后面比5小的有4321,但是4213这个并不是降序排列,所以是不合法的。
#include <bits/stdc++.h>
using namespace std;
int main() {
string str;
while (cin >> str) {
int flag = 0;
for (int i = 0; i < str.size(); i++) {
for (int j = i + 1; j < str.size(); j++) {
char c = str[j];
if (c < str[i]) {
for (int k = j + 1; k < str.size(); k++) {
if (str[k] < str[i]) {
if (c > str[k]) {
c = str[k];
} else {
flag = 1;
break;
}
}
}
}
if (flag) break;
}
if (flag) break;
}
if (flag) {
cout << "no\n";
} else {
cout << "yes\n";
}
}
return 0;
}
1210: 爬楼梯游戏
题目:现有n阶楼梯,PIPI从第一阶走到第n阶,每次可以跨一阶或者两阶,问PIPI从第一阶走到第n阶总共有多少种可能。为了防止结果过大,需要让结果对p取模。
ps: p = 1e9+7.
-
简单dp问题
dp[i]表示到第i层阶梯的方法数- 递推关系:
dp[i] = dp[i-1]+dp[i-2] - 初始化:
dp[1] = 1, dp[2] = 2;
-
注意点
- (1<=n<=1000000),输入大数据时,用scanf和printf,否则会超时
#include <bits/stdc++.h>
using namespace std;
const int p = 1e9 + 7, N = 1e6 + 10;
int f[N];
int main()
{
int n;
f[1] = 1, f[2] = 2;
for (int i = 3; i <= N; i++)
{
f[i] = (f[i - 1] + f[i - 2]) % p;
}
while (scanf("%d", &n) != EOF)
{
printf("%d\n", f[n]);
}
return 0;
}