PAT训练(1)

来源:互联网 发布:网络销售app软件 编辑:程序博客网 时间:2024/05/16 18:02

开题

今天开始做“PAT (Advanced Level) Practise”,开头Mark一下:
http://www.patest.cn/contests/pat-a-practise
账号STUqza,9.12机试,希望能上90…


打钩

今天的打钩情况:
这里写图片描述
今天做了6道水题,感觉快忘干净了,看来夏令营机试的时候没满分不是偶然,听说前面的题目比较简单,确实发现不少a+b,慢慢做呗,先熟悉起来,过几天水题上手了之后做做再研究下STL做数据结构。


1001. A+B Format (20)

就是A+B……,逗号不要搞错前后顺序就行,代码不贴了。


1002. A+B for Polynomials (25)

打死都不知道哪错了,一开始以为是考想用栈来做,后来直接撸无脑的,但都只得17分…,上代码。

-栈

#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<queue>#include <iomanip>using namespace std;const int maxn = 1005;int main(){    float a[30],b[30],c[maxn];    float ka,kb,kc,ma=-1,mb=-1,mc;    float cur;    queue<float> sa,sb,sc;    while(cin>>ka)    {        memset(c,0,sizeof(c));        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        ma=-1;mb=-1;        for(int i=1;i<=2*ka;i++)        {            cin>>a[i];            if(i%2==1)                ma=(ma<a[i])?a[i]:ma;        }                   cin>>kb;        for(int i=1;i<=2*kb;i++)        {            cin>>b[i];            if(i%2==1)                mb=(mb<b[i])?b[i]:mb;        }               mc=max(ma,mb);  //最高次数        for(int i=1;i<=2*ka;i++)            sa.push(a[i]);        for(int i=1;i<=2*kb;i++)            sb.push(b[i]);        for(int i=1;i<=2*(mc+1);i+=2)        {            c[i]=mc-(i/2);            if(sa.front()==c[i])            {                sa.pop();                c[i+1]+=sa.front();                sa.pop();             }            if(sb.front()==c[i])            {                sb.pop();                c[i+1]+=sb.front();                sb.pop();             }        }        kc=0;        for(int i=2;i<=2*(mc+1);i+=2)        if(c[i]!=0) kc++;        cout<<kc;        for(int i=1;i<=2*(mc+1);i+=2)        {            if(c[i+1]!=0)                cout<<setprecision(6)<<" "<<c[i]<<" "<<c[i+1];        }        cout<<endl;    }}

- 数组

#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<queue>#include<iomanip>using namespace std;const int maxn = 10005;int main(){    double c[maxn],cur;    int pc,k;    while(cin>>k)    {        memset(c,0,sizeof(c));        for(int i=1;i<=k;i++)        {            cin>>pc;            cin>>cur;            c[pc]+=cur;        }                   cin>>k;        for(int i=1;i<=k;i++)        {            cin>>pc;            cin>>cur;            c[pc]+=cur;        }               k=0;        for(int i=0;i<=1005;i++)        if(c[i]!=0) k++;        cout<<k;        for(int i=1005;i>=0;i--)        {            if(c[i]!=0)                cout<<" "<<i<<" "<<setprecision(3)<<c[i];        }        cout<<endl;    }}

- AC版

#include <stdio.h>#include <string.h>#include <stdlib.h>int main(){    int k;    double exp[1001];    memset(exp,0,sizeof(exp));    int flag = 0;    while(scanf("%d",&k)!= EOF)    {        int i;int j;        for (j = 0; j < k; j++)        {            scanf("%d",&i);            double coff;            scanf("%lf",&coff);                             exp[i] += coff;        }        scanf("%d", &k);        for (j = 0; j < k; j++)        {            scanf("%d",&i);            double coff;            scanf("%lf",&coff);                             exp[i] += coff;        }        int count=0;        for(i=1000;i>=0;i--)        {            if(exp[i]!=0) count++;        }            printf("%d",count );            for(i=1000;i>=0;i--){                if(exp[i]!=0) printf(" %d %.1lf",i,exp[i]);            }            printf("\n");            memset(exp,0,sizeof(exp));    }    return 0;}

有空再看…


1005. Spell It Right (20)

真心水题,后来想想为什么用case语句写了这么多真是脑残,不过把代码贴在这里也就是为了自己恶心自己。

#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<queue>using namespace std;int main(){    char number[101];    int ans[5],sum;    while(cin>>number)    {        sum=0;        for(int i=0;i<strlen(number);i++)        {            sum+=number[i]-'0';        }        memset(ans,0,sizeof(ans));        int i;        if(sum==0)        cout<<"zero";        for(i=0;sum!=0;i++)        {            ans[i]=sum%10;            sum/=10;         }        for(int j=i-1;j>=0;j--)        {            switch(ans[j])            {                case 0:                    cout<<"zero";                    break;                case 1:                    cout<<"one";                    break;                case 2:                    cout<<"two";                    break;                case 3:                    cout<<"three";                    break;                case 4:                    cout<<"four";                    break;                case 5:                    cout<<"five";                    break;                case 6:                    cout<<"six";                    break;                case 7:                    cout<<"seven";                    break;                case 8:                    cout<<"eight";                    break;                case 9:                    cout<<"nine";                    break;              }            if(j!=0)            cout<<" ";        }        cout<<endl;    }}

1006. Sign In and Sign Out (25)

一开始以为要用队列,后来发现有时水题,不过写这题时居然发现不会用strlen()函数了,2333,怒百度之,找到的东西点它看到。

#include<iostream>#include<algorithm>#include<cmath>#include<string>#include<queue>using namespace std;int main(){    int n,earlist,latest,cur;    string ID,in,out,unlocker,locker;    while(cin>>n)    {        earlist=9999999;        latest=-1;        for(int i=1;i<=n;i++)        {            cin>>ID>>in>>out;            cur=in[0]*100000+in[1]*10000+in[3]*1000+in[4]*100+in[6]*10+in[7];            if(earlist>cur)            {                earlist=cur;                unlocker=ID;            }             cur=out[0]*100000+out[1]*10000+out[3]*1000+out[4]*100+out[6]*10+out[7];            if(latest<cur)            {                latest=cur;                locker=ID;            }         }        cout<<unlocker<<" "<<locker<<endl;    }}

1007. Maximum Subsequence Sum (25)

看到子串以为是KMP,试了下暴力只卡了一组测试用例,把cin、cout改成C风格就过了。

#include<iostream>#include<iomanip>using namespace std;const int maxn = 10005;int main(){    int n,a[maxn],temp,ans,beg,end;    while(scanf("%d",&n)!=EOF)    {        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        temp=0;ans=-1;        for(int i=1;i<=n;i++)        {            temp=0;            for(int j=i;j<=n;j++)            {                temp+=a[j];                if(temp>ans)                {                    ans=temp;                    beg=i;                    end=j;                }            }        }        if(ans<0)            printf("0 %d %d\n",ans,a[1],a[n]);        else            printf("%d %d %d\n",ans,a[beg],a[end]);    }}

1008. Elevator (20)

以后20分的题要控制在10min之内过。

#include<iostream>using namespace std;int main(){    int n,a[105],cur,ans,next;    while(cin>>n)    {        for(int i=1;i<=n;i++)            cin>>a[i];        ans=0;cur=0;        for(int i=1;i<=n;i++)        {            next=a[i]-cur;            cur=a[i];            if(next>0)                ans+=6*next;            else                ans-=4*next;            ans+=5;        }        cout<<ans<<endl;        }}
0 0