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

1101 B是A的多少倍

普通模拟做

保留小数点后2位的函数为cout<

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

#include
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<

1102 教超冠军卷

普通模拟做

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

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

#include
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>a[i].s>>a[i].n>>a[i].ren;
        a[i].sum=a[i].n*a[i].ren;
    }
     for(int i=0;i

1103 缘分数 

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

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

#include
using namespace std;
#define int long long
mapmp;
signed main(){
    long long cha;
    int n,m;cin>>m>>n;
    for(int i=2;i<=148;i++){//cout<

 

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
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 ans;
   int n;cin>>n;
    for(int i=1;i<=n;i++){
        ans.clear();
        bool flag=0;
        cout<<"Case "<>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&¬prime[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<

1105 链表合并

记住deque的函数表达

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

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

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

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

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

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

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

前导0的写法

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

#include
using namespace std;
#define endl "\n"
pair add[100005];
int main()
{
    int A1,B1;int n;
    cin>>A1>>B1>>n;int ad,da,ne;
   // node p;
    for(int i=0;i>ad>>da>>ne;
        add[ad]={da,ne};    }
    dequea,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') <

1106 2019数列

普通的模拟

#include 
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

1107 老鼠爱大米

比1106简单的模拟

#include
using namespace std;
int aa[104];
int main()
{
    int n,m;cin>>n>>m;
    for(int i=0;i>a;maxx=max(maxx,a);
        }
        cout<

1108 String复读机

普通的模拟

#include
using namespace std;
string s;
int a[10]={0};
int main()
{
    cin>>s;
    for(int i=0;i

1109 擅长C

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

注意空格换行之类的

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

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

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

#include
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[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'Z'||ans[i]<'A')al++;
        
    for(int i=0;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
using namespace std;
pairadd[100005];
int a[100005];
stackst;
queueque;
vectorvec;
void pre(int len){
    for(int ii=0;ii=0;ii--)
        que.push(a[ii]);
}
int main()
{
    int A,n,K;cin>>A>>n>>K;int q;
    for(int i=0;i>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

1111 对称日

普通的模拟

#include
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>n;string m,d,y;
    for(int i=0;i>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<

 

1112 超标区间

普通的模拟

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

#include
using namespace std;
int a[10004];
int main()
{
    int n,T,maxx=0;bool f=0;
    cin>>n>>T;
    for(int i=0;i>a[i];
    for(int l=0;lT){
            f=1;
            int r=l;
            while(a[r]>T&&r

1113 钱串子的加法

普通的模拟

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

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

1114 全素日

普通的模拟

!注意:2是素数!!!

#include
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<

1115 裁判机

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

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

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

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

#include
using namespace std;
vectorex;
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 #"<

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

待测文件为:

#include
using namespace std;
typedef long long ll;
vectorex;
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 #"<

评测文件(正确的代码)

    #include
#include
#include
#include
using namespace std;
vectorv;
//unordered_mapmp;
int mp[100005]={0};
//unordered_mapexist;
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
#include
#include
using namespace std;
void data(){
	ofstream fout("input.txt");//将数据录入到input文件
	//根据题生成所需得数据然后数据范围要根据你的暴力程序去确定范围

	int A=rand()%100000+1;int B=rand()%100000+1;
	int l,r;
	fout<

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

简单模拟

#include
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<

1002 写出这个数

普通的模拟

注意:零是后鼻音

#include
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<>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
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
using namespace std;
vectorname;
vectorxue;
int cheng[1004];
int  main()
{
    int n;cin>>n;
    string a,b;int l;
    int maxx=0,minn=100;
    for(int i=0;i>a>>b;name.push_back(a);xue.push_back(b);
        cin>>l;cheng[l]=i;
        maxx=max(maxx,l);
        minn=min(minn,l);
    }
    cout<

1005 继续(3n+1)猜想

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

#include
using namespace std;
bool f[3500];
vectorve;
bool cmp(int a,int b){return a>b;}
int main()
{
    int K;cin>>K;
    for(int i=0;i>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

1006 换个格式输出整数

普通的模拟

#include
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>n;
    pri(n);
    return 0;
}

1007 素数对猜想

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

#include
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>n;int res=0;
    getprime(n);
    for(int i=1;i

1008 数组元素循环右移问题

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

!!注意m=n%m

#include
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>a[i];
    for(int i=n-m;i

1009 说反话

普通的模拟

#include 
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<

1010 一元多项式求导

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

#include
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<

 

1011 A+B 和 C

简单的模拟

#include
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 #"<

1012 数字分类

简单模拟

#include
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<

 

1013 数素数

用线性筛求质数

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

#include
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>n>>m;
    if(n==0)n=1;
    getprime();int c=0;
    for(int i=n-1;i

1014 福尔摩斯的约会

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

注意0的前置填充

!注意星期是A到G

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

#include
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<

1015 德才论

 1015 德才论 (25分) 

你可能感兴趣的:(c++,学习,算法,数据结构,链表)