一个小球从10m处落下,每次都弹回之前的高度一半,请问小球在静止之前一共走过多少距离。
思路
每一次都是之前高度的一半,可以用c表示,一直取a的一半,最后加上初始的高度。注意回弹是上下两次,要乘2。
具体实现
#include<bits/stdc++.h>
using namespace std;
int main(){
double a=10.0;
double sum=0.0;
double c=a/2;
while(c!=0){
sum+=2*c; //来回弹两次!
c=c/2;
}
sum+=a;
printf("%f",sum);
return 0;
}
我要通过
题目描述
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送——只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
-
字符串中必须仅有P、A、T这三种字符,不可以包含其它字符;
-
任意形如 xPATx 的字符串都可以获得“答案正确”,其中x或者是空字符串,或者是仅由字母A组成的字符串;
-
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中a、b、c均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式
每个测试输入包含1个测试用例。第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
思路
-
首先,简化三个条件:字符串仅由P、A、T三种字符组成,且符合xPATx、xPAATxx。(x为空字符串或仅由A组成)
-
由第三个条件可推 尾部A数量=头部A数量×中部A数量。
代码过程:
-
用一位flag表明目前已找到PAT中哪一位,分别处理,当flag=0,2,3时,若找到非A元素,判断是否是正在寻找的P或T,否则将flag置为-1,表明“答案错误”,同时分别记录各段A的个数。
-
当flag=1时,即已找到P,正在寻找A,下一位若非A,表明“答案错误”。
-
遍历完整串元素,验证flag=3,表面3个数均被找到且没有出现其他非法元素。验证是否符合尾部A数量=头部A数量×中部A数量。
具体实现
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=0; i<n; i++){ //每输入一个字符串,进行一次判断
string s;
cin>>s;
int flag=0; //已找到了PAT中第几个字母
int counta=0; //记录p前A的个数
int countb=1; //记录PT之间A的个数
int countc=-1; //记录T后A的个数
int j=0;
while(j<s.length()){
if(flag==1){ //已找到P,正在寻找A
if(s[j]!='A')
flag = -1; //表明答案错误
else{
flag++;
j++;
continue; //结束本次循环,接着进行下次循环的判定
}
}
else if(s[j]!='A'){
if(flag==3 && s[j]!='A') flag=-1;
if(flag==2){
if(s[j]!='T') flag=-1;
else flag++;
}
if(flag==0){
if(s[j]!='P') flag=-1;
else flag++;
}
}
if(flag==2) countb++;
if(flag==0) counta++;
if(flag==3) countc++;
j++;
}
if(flag!=3) cout<<"NO";
if(flag==3){
if(countc==(counta*countb)) cout<<"YES";
else cout<<"NO";
}
if(i!=n-1) cout<<"\n";
}
return 0;
}
小结
第二题的代码好好消化!
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情