[蓝蓝计算机考研算法]-day3

141 阅读3分钟

一个小球从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的“答案正确”大派送——只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

  1. 字符串中必须仅有P、A、T这三种字符,不可以包含其它字符;

  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中x或者是空字符串,或者是由字母A组成的字符串;

  3. 如果 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 天,点击查看活动详情