pat basic 的错题注意点【1001~1015、1101~1115】

这篇具有很好参考价值的文章主要介绍了pat basic 的错题注意点【1001~1015、1101~1115】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1101 B是A的多少倍

普通模拟做

保留小数点后2位的函数为cout<<fixed<<setprecision(2)<<a<<endl;

如果没有fixed,那就是输出有效数字2位的答案

#include<bits/stdc++.h>
using namespace std;
int num(long long a){
    int c=0;
    while(a){
        a=a/10;
        c++;
    }
    return c;    
}
int main(){
    long long a;cin>>a;
    int d;cin>>d;
    int n=num(a);//a位数
    long long b=a/pow(10,d);
    b=b+a%(long long)pow(10,d)*pow(10,n-d);
    cout<<fixed<<setprecision(2)<<1.0*b/a;
}

1102 教超冠军卷

普通模拟做

要注意只存在一种试卷且销量为0的情况,也就是说,判断

 if(top1.ren<=a[i].ren) 和 if(top2.sum<=a[i].sum)时要加上等号

#include<bits/stdc++.h>
using namespace std;
struct node{
    string s;
    long long n=0;//单价
    long long ren=0;
    long long sum=0;
};
int main()
{
    int n;cin>>n;
    node a[10005];
    node top1,top2;
    for(int i=0;i<n;i++){
        cin>>a[i].s>>a[i].n>>a[i].ren;
        a[i].sum=a[i].n*a[i].ren;
    }
     for(int i=0;i<n;i++){
        if(top1.ren<=a[i].ren){
            top1.s=a[i].s;top1.ren=a[i].ren;
        }
        if(top2.sum<=a[i].sum){
            top2.s=a[i].s;top2.sum=a[i].sum;
        }
    }
    cout<<top1.s<<" "<<top1.ren<<'\n';
    cout<<top2.s<<" "<<top2.sum<<'\n';
    return 0;
}

1103 缘分数 

用map做,复杂度148*(n-m)

注意:1 1不符合题意,不能输出(虽然没有懂为什么不符合题意)

#include<bits/stdc++.h>
using namespace std;
#define int long long
map<long long,long long>mp;
signed main(){
    long long cha;
    int n,m;cin>>m>>n;
    for(int i=2;i<=148;i++){//cout<<sqrt(sqrt(25000*25000*25000-24999*24999*24999)/2)约等于148
        cha=i*i+(i-1)*(i-1);
        mp[cha*cha]=i;//169--3
    }
    bool flag=0;
    for(int i=m;i<=n;i++){
        cha=i*i*i-(i-1)*(i-1)*(i-1);
        if(mp[cha]){
            flag=1;
            cout<<i<<" "<<mp[cha]<<endl;
        }
    }
    if(!flag){
        cout<<"No Solution\n";
    }
}

 

1104 天长地久

注意点1:它要排序!!!!所以用了vector vec来排序

注意点2:用来vector之后记得要vec.clear()!!!!!

//因为普通的加1肯定不行,所以都是A是9结尾的
//如果个位数是9,那么m=a+9  n=a+1,从2到90来找n和m符合最大公约数是一个大于 2 的素数
//但是找不到,公约数都是4或者8
//所以十位数也应该是9
//如果个位和十位都是9,那么m=a+18  n=a+1,从2到90来
#include<bits/stdc++.h>
using namespace std;
long long sum(long long a){
    long long sum=0;
    while(a){
        sum+=(a%10);
        a=a/10;
    }
    return sum;
}
struct node{
    long long b;long long s;
};
bool cmp(node a,node b){
    if(a.b!=b.b){return a.b<b.b;}
    return a.s<b.s;
}
bool notprime[100];
void pre(){
    for(int i=1;i<100;i++){
        for(int j=2;j*j<=i;j++){
            if(i%j==0){notprime[i]=1;break;}
        }
    }
    return;
}
int main()
{//尝试特别暴力地写代码
    pre();
    vector<node> ans;
   int n;cin>>n;
    for(int i=1;i<=n;i++){
        ans.clear();
        bool flag=0;
        cout<<"Case "<<i<<endl;
        int k,m;cin>>k>>m;
        for(int i=pow(10,k-3);i<=pow(10,k-2)-1;i++){//枚举A的前8位
            long long a=sum(i),b=sum(i+1);
            long long c=__gcd((long long)18+a,b);
            if(18+a==m&&c>2&&notprime[c]==0){
                node aa;aa.b=b;aa.s=i;
                ans.push_back(aa);
                flag=1;
            }
        }
        if(!flag){cout<<"No Solution\n";}
        else {
            sort(ans.begin(),ans.end(),cmp);
            for (auto i:ans){
                cout<<i.b<<" "<<i.s<<"99"<<endl;
            }
        }
    }
    return 0;
}

1105 链表合并

记住deque的函数表达

注意链表结点的next要更新!(我重改了一般,下次要想全面了)

!注意n==2m的时候要特判

【确实写得太麻烦了,写完太累了不想改了】

经历了最后一个测试点的洗礼之后又大改一次

最后一个测试点听过有1e6个结点所以我一开始的方法是记录所有节点信息(就是做了个离散化),结果最后一个点的就过不了(虽然我也不知道为什么)

因为地址1e5,所以就直接用pair数字记录结点了。

还是要注意各个情况的特判

前导0的写法

更简单的1105 链表合并 – PAT乙级真题 

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
pair<int,int> add[100005];
int main()
{
    int A1,B1;int n;
    cin>>A1>>B1>>n;int ad,da,ne;
   // node p;
    for(int i=0;i<n;i++){
        cin>>ad>>da>>ne;
        add[ad]={da,ne};    }
    deque<int>a,b;int L1num=1,L2num=1;
    //L1部分
    a.push_back(A1);
    int nex=add[A1].second;

    while(nex!=-1){
        L1num++;int now=nex;
        a.push_back(now);nex=add[now].second;
    }
    //L2部分
    b.push_back(B1);
    nex=add[B1].second;
    while(nex!=-1){
        L2num++;int now=nex;
        b.push_back(now);nex=add[now].second;
    }

    //假设L1>2L2,输出两个a的头,输出一个b的尾,记得要接上所有的尾
    int p1;int p2;
    if(L1num>=2*L2num){
        p1=a.front();a.pop_front();L1num--;
        while(L2num){
            cout<< setw(5) << setfill('0') <<p1<<" "<<add[p1].first<<" "<<setw(5) << setfill('0')<<add[p1].second<<endl;
            p1=a.front();a.pop_front();L1num--;
            p2=b.back();b.pop_back();
            cout<<setw(5) << setfill('0') <<p1<<" "<<add[p1].first<<" "<<setw(5) << setfill('0') <<p2<<endl;
            if(L1num){
                p1=a.front();a.pop_front();L1num--;
                cout<<setw(5) << setfill('0') <<p2<<" "<<add[p2].first<<" "<<setw(5) << setfill('0') <<p1<<endl;
                L2num--;
            }
            else{
                cout<<setw(5) << setfill('0') <<p2<<" "<<add[p2].first<<" "<<"-1"<<endl;
                return 0;
            }
        }
        if(a.empty())
            cout<<setw(5) << setfill('0') <<p1<<" "<<add[p1].first<<" "<<"-1"<<endl;
        else
            cout<<setw(5) << setfill('0') <<p1<<" "<<add[p1].first<<" "<<setw(5) << setfill('0')<<add[p1].second<<endl;
        while(!a.empty()){
           p1=a.front();a.pop_front();
           if(add[p1].second!=-1)
           cout<<setw(5) << setfill('0') <<p1<<" "<<add[p1].first<<" "<<setw(5) << setfill('0') <<add[p1].second<<endl;
            else
             cout<<setw(5) << setfill('0') <<p1<<" "<<add[p1].first<<" -1"<<endl;
        }
    }
    else{
        p2=b.front();b.pop_front();L2num--;
        while(L1num){
            cout<<setw(5) << setfill('0') <<p2<<" "<<add[p2].first<<" "<<setw(5) << setfill('0') <<add[p2].second<<endl;
            p2=b.front();b.pop_front();L2num--;
            p1=a.back();a.pop_back();
            cout<<setw(5) << setfill('0') <<p2<<" "<<add[p2].first<<" "<<setw(5) << setfill('0') <<p1<<endl;
            if(L2num){
                p2=b.front();b.pop_front();L2num--;
                cout<<setw(5) << setfill('0') <<p1<<" "<<add[p1].first<<" "<<setw(5) << setfill('0') <<p2<<endl;
                L1num--;
            }
            else{
                cout<<setw(5) << setfill('0') <<p1<<" "<<add[p1].first<<" "<<"-1"<<endl;
                return 0;
            }
        }
        if(!b.empty())
            cout<<setw(5) << setfill('0') <<p2<<" "<<add[p2].first<<" "<<setw(5) << setfill('0') <<add[p2].second<<endl;
        if(b.empty())
            cout<<setw(5) << setfill('0') <<p2<<" "<<add[p2].first<<" "<<"-1"<<endl;
        while(!b.empty()){
            p2=b.front();b.pop_front();
            cout<<setw(5) << setfill('0') <<p2<<" "<<add[p2].first<<" ";
            if(add[p2].second!=-1)
                cout<<setw(5) << setfill('0') <<add[p2].second<<endl;
            else
                cout<<"-1"<<endl;
        }
    }
}

1106 2019数列

普通的模拟

#include <bits/stdc++.h>
using namespace std;
int a[1004];
int main()
{
    a[0]=2,a[1]=0,a[2]=1,a[3]=9;
    int p=0,sum=0;
    int n;cin>>n;
    if(n==1){cout<<2;return 0;}
    if(n==2){cout<<20;return 0;}
    if(n==3){cout<<201;return 0;}
    if(n==4){cout<<2019;return 0;}
    cout<<"2019";
    sum=2+1+9;
    for(int i=4;i<n;i++){
        a[i]=sum%10;
        cout<<a[i];
        sum+=a[i];
        sum-=a[p];
        p++;
    }
    return 0;
}

1107 老鼠爱大米

比1106简单的模拟

#include<bits/stdc++.h>
using namespace std;
int aa[104];
int main()
{
    int n,m;cin>>n>>m;
    for(int i=0;i<n;i++){
        int maxx=0,a;
        for(int j=0;j<m;j++){
            cin>>a;maxx=max(maxx,a);
        }
        cout<<maxx;
        if(i!=n-1)cout<<" ";
        aa[i]=maxx;
    }
    cout<<'\n';int maxx=0;
    for(int i=0;i<n;i++){
        maxx=max(maxx,aa[i]);
    }
    cout<<maxx<<'\n';
    return 0;
}

1108 String复读机

普通的模拟

#include<bits/stdc++.h>
using namespace std;
string s;
int a[10]={0};
int main()
{
    cin>>s;
    for(int i=0;i<s.size();i++){
        if(s[i]=='S')a[0]++;
        if(s[i]=='t')a[1]++;
        if(s[i]=='r')a[2]++;
        if(s[i]=='i')a[3]++;
        if(s[i]=='n')a[4]++;
        if(s[i]=='g')a[5]++;
    }
    while(a[0]||a[1]||a[2]||a[3]||a[4]||a[5]){
        if(a[0]){
            cout<<'S';a[0]--;
        }
        if(a[1]){
            cout<<'t';a[1]--;
        }
        if(a[2]){
            cout<<'r';a[2]--;
        }
        if(a[3]){
            cout<<'i';a[3]--;
        }
        if(a[4]){
            cout<<'n';a[4]--;
        }
        if(a[5]){
            cout<<'g';a[5]--;
        }
    }
    return 0;
}

1109 擅长C

本来想着PHP直接复制黏贴的,发现题意读错了

注意空格换行之类的

!最后一个测试点要注意最后一个符号是可以没有的

!!注意字符串中间是有空格的,所以用readline

!!!字符串首和末可以有很多很多非英文大写字符,注意处理

#include<bits/stdc++.h>
using namespace std;
char mp[27][7][7];
void P(string sen,bool flag){
    for(int q=0;q<7;q++){
        for(int i=0;i<(int)sen.size();i++){
            for(int j=0;j<5;j++){
                cout<<mp[sen[i]-'A'][q][j];
            }
            if(i!=(int)sen.size()-1)
                cout<<' ';
        }
        cout<<'\n';
    }
    if(!flag)cout<<'\n';
}

int main()
{
    for(int i=0;i<26;i++)
        for(int j=0;j<7;j++)
            for(int k=0;k<5;k++)
                cin>>mp[i][j][k];

    string ans;string sen="";
    cin.get();
    getline(cin,ans);
    int num=0,al=1;
    int length=ans.size();
    for(int i=length-1;i>=0;i--){
        if(ans[i]>'Z'||ans[i]<'A')length--;
        else break;
    }
    for(int i=0;i<length;i++)
        if(ans[i]>'Z'||ans[i]<'A')al++;
        
    for(int i=0;i<length;i++){
        if(ans[i]>'Z'||ans[i]<'A'){
            num++;
            if(sen!=""){
                P(sen,num==al);sen="";
            }
        }
        else
            sen=sen+ans[i];
    }
    num++;
    if(sen!="")P(sen,num==al);
    sen="";
    return 0;
}

1110 区块反转

感觉比1109和1105要简单

#include<bits/stdc++.h>
using namespace std;
pair<int,int>add[100005];
int a[100005];
stack<int>st;
queue<int>que;
vector<int>vec;
void pre(int len){
    for(int ii=0;ii<len;ii++){
        a[ii]=st.top();st.pop();
    }
    for(int ii=len-1;ii>=0;ii--)
        que.push(a[ii]);
}
int main()
{
    int A,n,K;cin>>A>>n>>K;int q;
    for(int i=0;i<n;i++){
        cin>>q;cin>>add[q].first>>add[q].second;
    }
    int now=A;
    int length=0;
    while(now!=-1){
        st.push(now);//链表结点stack
        length++;
        now=add[now].second;
    }
    if(length%K) pre(length%K);//先处理多出来的结点
    
    for(int i=0;i<length/K;i++) pre(K);

    while(!que.empty()){
        int now=que.front();que.pop();
        cout<<setw(5)<<setfill('0')<<now;
        cout<<" "<<add[now].first;
        if(!que.empty())
            cout<<" "<<setw(5)<<setfill('0')<<que.front()<<'\n';
        else cout<<" -1"<<'\n';
    }
    return 0;
}

1111 对称日

普通的模拟

#include<bits/stdc++.h>
using namespace std;
string ver(string y,string m,string d){
    if(m=="Jan")y=y+"01";
    if(m=="Feb")y=y+"02";
    if(m=="Mar")y=y+"03";
    if(m=="Apr")y=y+"04";
    if(m=="May")y=y+"05";
    if(m=="Jun")y=y+"06";
    if(m=="Jul")y=y+"07";
    if(m=="Aug")y=y+"08";
    if(m=="Sep")y=y+"09";
    if(m=="Oct")y=y+"10";
    if(m=="Nov")y=y+"11";
    if(m=="Dec")y=y+"12";
    if (d[1]==',')y=y+"0"+d[0];
    else y=y+d[0]+d[1];
    return y;
}
string ju(string da){
    for(int i=0,j=(int)da.size()-1;i<j;i++,j--){
        if(da[i]!=da[j])return "N";
    }
    return "Y";
}
int main()
{
    int n;cin>>n;string m,d,y;
    for(int i=0;i<n;i++){
        cin>>m>>d>>y;
        if(y.size()==1)y="000"+y;
        if(y.size()==2)y="00"+y;
        if(y.size()==3)y="0"+y;
        string data=ver(y,m,d);
        cout<<ju(data)<<" "<<data<<'\n';
    }
    
    return 0;
}

 

1112 超标区间

普通的模拟

注意:如果没有数据超标,则在一行中输出所有数据的最大值。

#include<bits/stdc++.h>
using namespace std;
int a[10004];
int main()
{
    int n,T,maxx=0;bool f=0;
    cin>>n>>T;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int l=0;l<n;l++){
        maxx=max(maxx,a[l]);
        if(a[l]>T){
            f=1;
            int r=l;
            while(a[r]>T&&r<n){
                r++;
            }
            cout<<"["<<l<<", "<<r-1<<"]"<<endl;
            l=r-1;
        }
    }
    if(!f)cout<<maxx;
    
    return 0;
}

1113 钱串子的加法

普通的模拟

注意:在输出的时候处理前导0,使得普通的0也可以输出

    bool flag=0;
    for(int i=lena-1;i>=0;i--){
        if(!flag&&c[i]=='0'&&i!=0)continue;
        cout<<c[i];flag=1;
    } 

1114 全素日

普通的模拟

!注意:2是素数!!!

#include<bits/stdc++.h>
using namespace std;
int da[10];
bool pri(int a){
    if(a==1)return 0;
    if(a==2)return 1;
    for(int i=2;i*i<=a;i++){
        if(a%i==0)return 0;
    }
    return 1;
}
int main()
{
    string a;cin>>a;
    int sum=0;
    for(int i=7;i>=0;i--){
        sum=(a[i]-'0')*pow(10,7-i)+sum;
        da[i]=sum;
    }
    bool fl=1;
    for(int i=0;i<8;i++){
        cout<<setw(8-i)<<setfill('0')<<da[i]<<" ";
        if(pri(da[i]))cout<<"Yes\n";
        else {fl=0;cout<<"No\n";}
    }
    if(fl)cout<<"All Prime!";
    return 0;
}

1115 裁判机

注意:样例输入的矩阵是每一行是同一个人不同轮次输入的数字

!注意: Round #k: i is out. 是一个一个输出的,不是合在一起输出的

!!!注意int num[14][1002];是这样设置的,不要设倒了!!

【不然会会浪费个5、6个小时……还没有runtime error的报错……】

#include<bits/stdc++.h>
using namespace std;
vector<int>ex;
bool vis[100005]={0};
bool iru[100005]={0};
bool peo[11]={0};
int num[14][1002];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int a,b;cin>>a>>b;
    ex.push_back(a);ex.push_back(b);
    iru[a]=1;iru[b]=1;
    vis[abs(a-b)]=1;
    int n,m;
    cin>>n>>m;
    int ans;int lo=0;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            cin>>num[i][j];
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            ans=num[j][i];if(peo[j])continue;
             if(vis[ans]==1&&!iru[ans]){
                iru[ans]=1;
                for(auto u:ex){
                    vis[abs(u-ans)]=1;
                }
                ex.push_back(ans);
            }
            else{
                peo[j]=1;lo++;
                cout<<"Round #"<<i<<": ";
                cout<<j<<" ";
                cout<<"is out.\n";
            }
        }
    }
    if(lo==n)cout<<"No winner.";
    else{
        cout<<"Winner(s):";
        for(int i=1;i<=n;i++)
            if(!peo[i])cout<<" "<<i;
    }
    return 0;
}

顺便为了做这道题,我学会了对拍

待测文件为:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int>ex;
bool vis[100005];
bool iru[100005];
bool peo[11]={0};
int num[14][1002];
int main()
{
	freopen("input.txt","r",stdin);//生成得数据文件
	freopen("output1.txt","w",stdout);//输出文件
	//下面填你的待测程序
     ios::sync_with_stdio(0);
     cin.tie(0);
    int a,b;cin>>a>>b;
    ex.push_back(a);ex.push_back(b);
    iru[a]=1;iru[b]=1;
    vis[abs(a-b)]=1;
    int n,m;
    cin>>n>>m;
    int ans;int lo=0;
    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++){
            cin>>num[i][j];
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            ans=num[j][i];if(peo[j])continue;
             if(vis[ans]==1&&!iru[ans]){
                iru[ans]=1;
                for(auto u:ex){
                    vis[abs(u-ans)]=1;
                }
                ex.push_back(ans);
            }
            else{
                peo[j]=1;lo++;
                cout<<"Round #"<<i<<": ";
                cout<<j<<" ";
                cout<<"is out.\n";
            }
        }
    }
    if(lo==n)cout<<"No winner.";
    else{
        cout<<"Winner(s):";
        for(int i=1;i<=n;i++){
            if(!peo[i])cout<<" "<<i;
        }
    }
	return 0;
}

评测文件(正确的代码)

    #include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
vector<int>v;
//unordered_map<int,int>mp;
int mp[100005]={0};
//unordered_map<int,int>exist;
int exist[100005]={0};
bool ac(int number)
{
    for (int i = 0; i < v.size(); ++i) {
        for (int j = i+1; j < v.size() ; ++j) {
            if(abs(v[i]-v[j])==number&&exist[number]!=1)return true;
        }
    }
    return false;
}
int main(){
	freopen("input.txt","r",stdin);//生成得数据文件
	freopen("output2.txt","w",stdout);//输出文件
    int a,b;
    cin>>a>>b;
    v.push_back(a);
    v.push_back(b);
    exist[a]=1;
    exist[b]=1;
    int N,M;
    cin>>N>>M;
    int cnt=0;
    int arr[N][M];
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < M; ++j)
            scanf("%d",&arr[i][j]);
    for (int j = 0; j < M; ++j) {//第j+1轮
        for (int i = 0; i < N; ++i) {//第i+1个人
            if(mp[i]!=-1){
                if(ac(arr[i][j])){
                    v.push_back(arr[i][j]);
                    exist[arr[i][j]]=1;
                }
                else{
                    printf("Round #%d: %d is out.\n",j+1,i+1);
                    mp[i]=-1;
                    cnt++;
                }
            }
        }
    }
    if(cnt!=N){
        cout<<"Winner(s):";
        for (int i = 0; i < N; ++i) {
            if(mp[i]!=-1)printf(" %d",i+1);
        }
    }
    else  printf("No winner.\n");
    return 0;
}

数据生成

#include<iostream>
#include<ctime>
#include<fstream>
using namespace std;
void data(){
	ofstream fout("input.txt");//将数据录入到input文件
	//根据题生成所需得数据然后数据范围要根据你的暴力程序去确定范围

	int A=rand()%100000+1;int B=rand()%100000+1;
	int l,r;
	fout<<A<<" "<<B<<endl;
	int n=rand()%9+2;int m=rand()%999+2;
	fout<<n<<" "<<m<<endl;
	for(int i=0;i<m;i++){
	     for(int j=0;j<n;j++){
               l=rand()%(max(A,B)+3)+1;
               fout<<l<<" ";
		}
		fout<<"\n";
	}
	fout.close();

}
bool test(){
	data();//生成数据
	system("test.exe");//运行待测程序
	system("bl.exe");//运行评测程序
	return !system("fc output1.txt output2.txt");//比对这俩的输出是否一样
}
int main(){
	srand(time(NULL));
	for(int i=0;i<100000;i++){//随便测个100次
	     cout<<i<<'\n';
		if(!test()) break;
	}
	return 0;
}

1001 害死人不偿命的(3n+1)猜想

简单模拟

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;cin>>n;
    int c=0;
    while(n!=1){
        if(n%2==0){
            n=n/2;
        }
        else{
            n=(3*n+1)/2;
        }
        c++;
    }
    cout<<c<<endl;
    return 0;
}

1002 写出这个数

普通的模拟

注意:零是后鼻音

#include<bits/stdc++.h>
using namespace std;
int p(string s){
    int sum=0;
    for(int i=0;i<(int)s.size();i++){
        sum=sum+(s[i]-'0');
    }
    return sum;
}
string ss[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
void ps(int n){
    int t=n;int wei=0;
    while(t){
        t=t/10;wei++;
    }
    for(int i=wei-1;i>=0;i--){
        int y=n/pow(10,i);
        cout<<ss[y];
        n=n%(int)(pow(10,i));
        if(i)cout<<" ";
    }
}
int main()
{
    string s;cin>>s;
    if(s=="0"){cout<<"ling";return 0;}
    int sum=p(s);
    ps(sum);
    return 0;
}

1003 我要通过!

#根本看不懂这题目在讲什么

题目意思:PAT乙级-1003-“我要通过”详解-为什么连题目都看不懂_pat我要通过

 从上一个链接中可以知道,第三个条件中:

当a和c相等,PAT,PAAT,PAAAT,PAAAAT……都是正确的

当a和c为一开始为A,APATA,APATA,APAATAA,APAAATAAA,APAAAATAAAA……正确

当a和c为一开始为AA,AAPATAA,AAPAATAAAA,AAPAAATAAAAAA

也就是说,len(a)*len(b)=len(c) 且len(b)不等于0即可

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T;cin>>T;
    cin.get();
    while(T--){
        string s;
        getline(cin,s);
        int P=-1,T=-1;
        bool flag=0;
        for(int i=0;i<(int)s.size();i++){
            if(s[i]=='P'){//有且只有一个P
                if(P==-1)P=i;
                else {cout<<"NO\n";flag=1;break;}
            }
            else if(s[i]=='T'){//有且只有一个T
                if(T==-1)T=i;
                else {cout<<"NO\n";flag=1;break;}
            }
            else if(s[i]!='A'){cout<<"NO\n";flag=1;break;}//只有PAT
        }
        if(flag==1)continue;
        int lena=0,lenb=0,lenc=0;
        lena=P;
        lenb=T-P-1;
        lenc=(int)s.size()-T-1;
        if(lena*lenb==lenc&&lenb!=0)cout<<"YES\n";
        else cout<<"NO\n";
    }
}

1004 成绩排名

普通的模拟

#include<bits/stdc++.h>
using namespace std;
vector<string>name;
vector<string>xue;
int cheng[1004];
int  main()
{
    int n;cin>>n;
    string a,b;int l;
    int maxx=0,minn=100;
    for(int i=0;i<n;i++){
        cin>>a>>b;name.push_back(a);xue.push_back(b);
        cin>>l;cheng[l]=i;
        maxx=max(maxx,l);
        minn=min(minn,l);
    }
    cout<<name[cheng[maxx]]<<" "<<xue[cheng[maxx]]<<"\n";
    cout<<name[cheng[minn]]<<" "<<xue[cheng[minn]]<<"\n";
    return 0;
}

1005 继续(3n+1)猜想

一开始做麻烦了,写成并查集了

#include<bits/stdc++.h>
using namespace std;
bool f[3500];
vector<int>ve;
bool cmp(int a,int b){return a>b;}
int main()
{
    int K;cin>>K;
    for(int i=0;i<K;i++){
        int n;
        cin>>n;ve.push_back(n);
        if(f[n]==1)continue;
        while(n!=1){
            if(n%2==0){
                n=n/2;
                f[n]=1;
            }
            else{
                n=(3*n+1)/2;
                f[n]=1;
            }
        }
    }
    sort(ve.begin(),ve.end(),cmp);
    int ans=0;
    for(int i=0;i<K;i++)
        if(!f[ve[i]]){ans++;}
    
    for(int i=0;i<K;i++){
        if(!f[ve[i]]){
            cout<<ve[i];ans--;
            if(ans!=0){cout<<" ";}
        }
    }
    return 0;
}

1006 换个格式输出整数

普通的模拟

#include<bits/stdc++.h>
using namespace std;
void pri(int n){
    int a,b,c;
    a=n/100;
    c=n%10;
    b=(n%100)/10;
    for(int i=0;i<a;i++)cout<<"B";
    for(int i=0;i<b;i++)cout<<"S";
    for(int i=1;i<=c;i++)cout<<i;
}
int main()
{
    int n;cin>>n;
    pri(n);
    return 0;
}

1007 素数对猜想

线性筛求质数,之后把符合要求的质数对找出来

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
bool notprime[maxn];
int prime[maxn],cnt;
void getprime(int ma) {
	notprime[0]=notprime[1]=1;
	cnt=0;
	for(int i=2;i<=ma;++i) {
		if(!notprime[i]) {
			prime[cnt++]=i;//筛质数
		}
       	for(int j=0;j<cnt && 1ll*i*prime[j]<=ma;++j) {
            notprime[i*prime[j]]=1;
            if(i%prime[j]==0) {
                break;
            }
		}
	}
}
int main()
{
    int n;cin>>n;int res=0;
    getprime(n);
    for(int i=1;i<cnt;i++){
        if((prime[i]-prime[i-1])==2){
            res++;
        }
    }
    cout<<res;
    return 0;
}

1008 数组元素循环右移问题

!注意n=m时的格式输出问题

!!注意m=n%m

#include<bits/stdc++.h>
using namespace std;
int a[1004];
int main()
{
    int n,m;cin>>n>>m;int c=0;
    m=m%n;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=n-m;i<n;i++){
        cout<<a[i];c++;
        if(c!=n){cout<<" ";}
    }
    for(int i=0;i<n-m;i++){
        cout<<a[i];c++;
        if(c!=n){cout<<" ";}
    }
}

1009 说反话

普通的模拟

#include <bits/stdc++.h>
using namespace std;
string s[100];
int main()
{
    int cnt=0;
    while(cin>>s[cnt]){
        cnt++;
    }
    for(int i=cnt-1;i>=0;i--){
        cout<<s[i];
        if(i)cout<<" ";
    }
    return 0;
}

1010 一元多项式求导

一些关于题目的解释:1010 一元多项式求导 (25分)【附加思路和测试点分析】

#include<bits/stdc++.h>
using namespace std;
int a[1004],b[1004];
int main()
{
    int cnt=0;
    while(cin>>a[cnt]>>b[cnt]){
        cnt++;
    }
    if(!b[cnt-1]&&cnt==1){
        cout<<a[0]*b[0]<<" ";
        cout<<b[0];
        return 0;
    }
    else if(!b[cnt-1]) cnt--;
        
    for(int i=0;i<cnt;i++){
        cout<<a[i]*b[i]<<" ";
        cout<<b[i]-1;
        if(i!=cnt-1)cout<<" ";
    }
    return 0;
}

 

1011 A+B 和 C

简单的模拟

#include<bits/stdc++.h>
using namespace std;
# define int long long
signed main()
{
    int T;cin>>T;int a,b,c;
    for(int i=1;i<=T;i++){
        cin>>a>>b>>c;
        if(a+b>c)cout<<"Case #"<<i<<": true\n";
        else cout<<"Case #"<<i<<": false\n";
    }
    return 0;
}

1012 数字分类

简单模拟

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int A=0,B=0,C=0,D=0,E=-1,flag=1,Dn=0,Bn=0,An=0;
    int a,n;cin>>n;
    while(n--){
        cin>>a;
        if(!(a%10)){
            A+=a;An++;
        }
        if(a%5==1){
            B=B+flag*a;Bn++;
            flag=flag*-1;
        }
        if(a%5==2)C++;
        if(a%5==3){D=D+a;Dn++;}
        if(a%5==4)E=max(E,a);
    }
    if(!An)cout<<"N ";
    else cout<<A<<" ";
    if(!Bn)cout<<"N ";
    else cout<<B<<" ";
    if(!C)cout<<"N ";
    else cout<<C<<" ";
    if(!Dn)cout<<"N ";
    else cout<<fixed<<setprecision(1)<<1.0*D/Dn<<" ";
    if(E==-1)cout<<"N";
    else cout<<E;
}

 

1013 数素数

用线性筛求质数

!注意测试点4:参照1013 数素数 (20 分)+测试点4 需要注意最大N=10000,即第10000个素数大约在105000 内

#include<bits/stdc++.h>
using namespace std;
# define ma 105000
bool notprime[105000];
int prime[ma],cnt;
void getprime() {
	notprime[0]=notprime[1]=1;
	cnt=0;
	for(int i=2;i<=ma;++i) {
		if(!notprime[i]) {
			prime[cnt++]=i;//筛质数
		}
       	for(int j=0;j<cnt && 1ll*i*prime[j]<=ma;++j) {
            notprime[i*prime[j]]=1;
            if(i%prime[j]==0) {
                break;
            }
		}
	}
}
int main()
{
    int n,m;cin>>n>>m;
    if(n==0)n=1;
    getprime();int c=0;
    for(int i=n-1;i<m;i++){
        cout<<prime[i];c++;
        if(c%10&&i!=m-1)cout<<" ";
        if(c%10==0&&c!=0)cout<<"\n";
    }
    
    return 0;
}

1014 福尔摩斯的约会

#感觉像是随便编出来的暗号,就硬掰

注意0的前置填充

!注意星期是A到G

!!注意小时前面也有前导零

#include<bits/stdc++.h>
using namespace std;
string week[]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
int main()
{
    string a,b,c,d;
    int we=0,hou=0,minu=0;
    cin>>a>>b>>c>>d;
    int cou=0;
    for(int i=0;i<(int)a.size();i++){
        if(a[i]==b[i]&&b[i]>='A'&&b[i]<='G'&&!cou){
            we=a[i]-'A';cou++;
        }
        else if(a[i]==b[i]&&cou){
            if(a[i]<='9'&&a[i]>='0'){
                hou=a[i]-'0';break;
            }
            else if(a[i]<='N'&&a[i]>='A'){
                hou=10+(a[i]-'A');break;
            }
        }
    }
    for(int i=0;i<(int)c.size();i++){
        if(c[i]==d[i]){
            if(c[i]>='a'&&d[i]<='z'){
                minu=i;break;
            }
            else if(c[i]>='A'&&d[i]<='Z'){
                minu=i;break;
            }
        }
    }
    cout<<week[we]<<" "<<setw(2)<<setfill('0')<<hou<<":"<<setw(2)<<setfill('0')<<minu;
    return 0;
}

1015 德才论

 1015 德才论 (25分) 文章来源地址https://www.toymoban.com/news/detail-422840.html

到了这里,关于pat basic 的错题注意点【1001~1015、1101~1115】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1001序列检测器

    multisim仿真文件:1001序列检测器(mealy机)-单片机文档类资源-CSDN下载 modelsim仿真文件:1001序列检测器modelsim仿真和测试文件-单片机文档类资源-CSDN下载 实验报告:1001序列检测器实验报告-单片机文档类资源-CSDN下载 电 子 科 技 大 学 课程设计名称:           1001 序列检

    2024年02月06日
    浏览(46)
  • HAUE河工计院OJ1001 - 1050题解

    目录 1001: a+b 1002: 分铅笔  1003: 求圆的面积  1004: 正整数的位数  1005: 英文字母的字母表位序  1006: 两个整数的四则运算  1007: 三位数的数位分离  1008: 压岁钱存款  1009: 等差数列求和  1010: 输出字符ASCII码值的2倍  1011: 虫子吃苹果 1012: 三个整数的和 1013: 身份证求出生日期

    2024年02月08日
    浏览(38)
  • 2022百度之星程序设计大赛 - 初赛 - 第二场 1001 和

    problem solution 题意: 给出长为n的序列,q次询问区间是否存在=k个数之和=x。 n,q 1e5, k 10. 思路: 因为要和=x,所以让和尽可能大,即判断区间中最大的k个数之和是否大于x即可。 即区间最大,倒数第2大,倒数第3大,倒数第k大之和即可,k10,可以暴力。 对于区间从小到大第

    2024年02月16日
    浏览(37)
  • 序列检测“1101”

    目录 1.题意描述 2.利用摩尔型状态机求解  3.利用米利型状态机求解 4.摩尔型状态机与米利型状态机的区别 用状态机检测“1101”序列,当检测到后将o_valid标志信号拉高。考虑序列叠加情况,即“1101101101”将会识别出3个“1101” 摩尔型状态机:输出只与当前状态有关,与当前

    2024年02月06日
    浏览(35)
  • verilog实现1101序列检测

    学习状态机,这是数电部分非常重要的基础知识,现在利用Verilog来实现,并用modelsim进行仿真。 序列检测并非完全等价于状态机,而是状态机重要应用之一。本次实验进行序列检测1101,当这个序列出现时,输出高电位,其他状态都为0。 常见的序列检测有循环检测和非循环检

    2024年02月05日
    浏览(33)
  • P1101 单词方阵

    网址如下: P1101 单词方阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 开学哩 水了一题 代码如下:

    2024年02月19日
    浏览(27)
  • ADS1115 模拟IIC

     ADS1115是16位ADC,基准源内部可选,PGA 可提供从 ±256mV 到 ±6.144V 的输入范围。    地址可由ADDR引脚决定,一般接地,地址为0x90 写寄存器地址为0x90,读寄存器地址为0x91  ADS1115有4个控制寄存器,0x00,0x01,0x02 0x00   0x01:配置通道、增益、基准源等     0x02    读数据流程: (1)发

    2024年02月09日
    浏览(36)
  • 独立开发者碎碎念 1115

    在巨大焦虑的心态下,人都来不及生病。我记忆中,高考前神经高度紧张,高考后一场大病如期而至。 人啊,真复杂。心态啊,真正能做到面对任何事客观平常心的,有几个呢 因此尽可能保持客观平常心面对,想到最糟糕的结局和处理方式吧 关于目标,我一直这样区分的逻

    2024年02月01日
    浏览(46)
  • ADS1115--已调通(附源码)

    最近做项目用到了ADS1115,一款常用的16位ADC,下面说说本人的理解 对于用户来说我们能从上面这张框图GET到以下几点: adc类型为16位∑-Δ型,意味着精度还是比较高了 MUX为输入多路复用器,作用可以理解为对输入方式进行选择,比如是用差分还是单端输入 PGA为可编程增益放

    2024年02月16日
    浏览(36)
  • P1115 最大子段和

    P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。 第一行是一个整数,表示序列的长度 n。 第二行有 n 个整数,第 i 个整数表示序列的第 i 个数字 ai​。 输出一行一个整数表示答案。

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包