[蓝蓝计算机考研算法训练二期]-day03

73 阅读2分钟

4.一个小球从10m,落下,每次弹回之前高度的一半,请问小球在静止之前一共走过多少距离。

思路

除了第一次落地,接下来每次落地前经过的距离均为前一次落地前的高度一半,为等比数列。求等比数列的和并对n取极限即为所求。

具体实现

#include <iostream>
using namespace std;

int main() {
    double n=10.0;
    double sum=10.0;
    while(n!=0){
        n=n/2;
        sum += n*2;
    }
    printf("%f", sum);
    return 0;
}

我要通过

“答案正确” 是自动判题系统给出的最令人欢喜的回复。本题属于PAT的 “答案正确” 大派送———只要读入的字符串满足下列条件,系统就输出 “答案正确” ,否则输出 “答案错误”

得到 “答案正确” 的条件是: 1.字符串中必须仅有P、A、T这三种字符,不可以包含其他字符; 2.任意形如xPATx的字符串都可以获得“答案正确”,其中x或者是空字符串,或者仅由字母A组成的字符串; 3.如果aPbTc是正确的,那么aPbATca也是正确的,其中a,b,c均或者是空字符串,或者是仅由字母A组成的字符串。

现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得 “答案正确” 的。

输入格式:

每个测试输入包括1个测试用例。第一行给出一个真整数n(≤10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得 “答案正确” ,则输出YES,否则输出NO。

输入样例

  • 10
  • PAT
  • PAAT
  • AAPATAA
  • AAPAATAAAA
  • xPATx
  • PT
  • Whatever
  • APAAATAA
  • APT
  • APATTAA

输出样例

  • YES
  • YES
  • YES
  • YES
  • NO
  • NO
  • NO
  • NO
  • NO
  • NO

具体实现

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    int n;
    string s;
    cin >> n;
    vector<int> q(n,0);
    for(int i=0; i<n; i++){
        cin >> s;
        vector<int> tip(3,-1);    //记录PAT三字母是否出现 0:P 1:A 2:T
        int head = 0;
        for(int j=0; j<s.length(); j++){
            string t = s.substr(j,1);
            if(t == "P"){
                tip[0] = j;
            }
            if(t == "A"){
                if(tip[0] != -1 && tip[1] == -1){
                    tip[1] = j;
                }
            }
            if(t == "T"){
                if(tip[0] != -1 && tip[1] != -1 && tip[2] == -1){
                    tip[2] = j;
                }
            }
        }//判断字符串中是否存在PAT三个字符,并记录三个字符第一次出现的下标
        if(tip[0] == -1 || tip[1] == -1 || tip[2] == -1){
            q[i] = 1;
        }
        //检查P前面
        for(int j=0; j<tip[0]; j++){
            string tq = s.substr(j,1);
            if(tq != "A"){
                q[i] = 1;
            }
        }
        //检查T后面
        for(int j=tip[2]+1; j<s.length(); j++){
            string tp = s.substr(j,1);
            if(tp != "A"){
                q[i] = 1;
            }
        }
        //检查中间,按规则P与T之间最多有两个A
        int sum = 0;
        for(int j=tip[0]; j<tip[2]; j++){
            string tm = s.substr(j,1);
            if(tm == "A"){
                sum++;
            }
        }
        if(sum>2){
            q[i] = 1;
        }
    }

    for(int i=0; i<n; i++){
        if(q[i]==1){
            cout << "NO" << endl;
        }else {
            cout << "YES" << endl;
        }
    }

    return 0;
}