PIPIOJ-2019年中南大学研究生复试机试题--未完

332 阅读1分钟

传送门

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;
}