【PAT乙级】1003 我要通过! (20 分)详解
生活随笔
收集整理的這篇文章主要介紹了
【PAT乙级】1003 我要通过! (20 分)详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192
這道題題目很難懂,本題的本質是找規律。
首先分析題目不難看出以下條件:
- P A T 三個字母必須都有,且只有這三個字母 且 P T 只能出現一次。
- P 和 T 之間必須至少有一個A
問題的難點就在于第三個條件上
下圖轉自: https://www.freesion.com/article/79691103906/
可以發現規律: 前段A的數量 * 中間A的數量 = 后端A的數量
總的代碼如下:
#include<cstdio> #include<iostream> #include<map> using namespace std; int main(void) {int n; cin>>n;while(n--) {string s; cin>>s;map<char,int>mp;int p=0,t=0;for(int i=0;i<s.size();i++){mp[s[i]]++;if(s[i]=='P') p=i;//記錄 P 的位置if(s[i]=='T') t=i;//記錄 T 的位置}if(mp.size()==3&&mp['T']==1&&mp['P']==1&&(t-p>1)&&mp['A']!=0&&p*(t-p-1)==(s.size()-1-t))// 僅有三個字母 T的數量是1 P的數量是1 P和T中間有A字母 前段A的數量 * 中間A的數量 = 后端A的數量cout<<"YES"<<endl;elsecout<<"NO"<<endl;} } #include<bits/stdc++.h> using namespace std; int main(void) {int n; cin>>n;for(int i=1;i<=n;i++){string s; cin>>s;map<char,int>mp;bool flag=false;for(int i=0;i<s.size();i++)mp[s[i]]++;if(mp.size()==3&&mp['P']==1&&mp['A']&&mp['T']==1) {int l=s.find('P');int r=s.find('T');int len1=l,len2=r-l+1-2,len3=s.size()-r-1;if(r-l>1&&len1*len2==len3) flag=true;}if(flag) cout<<"YES";else cout<<"NO";if(i!=n) puts("");} }如果還不懂可以看以下幾個寫的好的博客:
方案一
方案二
總結
以上是生活随笔為你收集整理的【PAT乙级】1003 我要通过! (20 分)详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【PAT乙级】1001 害死人不偿命的(
- 下一篇: 【PAT乙级】 1004 成绩排名 (2