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