ACM培训练习总结 1

来源:互联网 发布:高斯白噪声协方差矩阵 编辑:程序博客网 时间:2024/05/20 03:06

昨天上完课六点开的题,做了一天UVa之后困得要死,做培训提出了各种喜闻乐见的错误。。

除了运行错误和内存超限,其他的错误犯了个遍。。



第一题水题一个。。

Ac代码:

#include <iostream>#include <cstring>#define maxn 110using namespace std;void print(int i){    switch(i)    {        case 1:cout<<"yi";break;        case 2:cout<<"er";break;        case 3:cout<<"san";break;        case 4:cout<<"si";break;        case 5:cout<<"wu";break;        case 6:cout<<"liu";break;        case 7:cout<<"qi";break;        case 8:cout<<"ba";break;        case 9:cout<<"jiu";break;        case 0:cout<<"ling";break;    }}int main(){    char a[maxn]={0};    while(cin>>a)    {        int sum=0,b,c,d;        for(int i=0;i<strlen(a);i++)            sum+=a[i]-'0';        d=sum/100;        b=sum%100/10;        c=sum%10;        if(d)        {            print(d);            cout<<" ";        }        if(d!=0||b!=0)        {            print(b);            cout<<" ";        }        print(c);        cout<<endl;        memset(a,0,sizeof(a));    }    return 0;}


第二题是求最大连续和的,之前上课学长说还有种比二分扫描更快的方法,只需要一次扫描。一开始没理解对结束位置的取值。后来子序列开头和结尾一直没有找好,错了好几次。。

Ac代码:

#include<iostream>#include<algorithm>#define maxn 5050using namespace std;int main(){    int n,a[maxn],t=1;    cin>>n;    while(n--)    {        int j=0,m,st=0,ed=0,sum=0,sum_max=0;        cin>>m;        for(int i=0;i<m;i++)        {            cin>>a[i];            if(a[i]<=0)                j++;        }        if(j==m)        {            int maxm=0;            for(int i=0;i<m;i++)                if(a[maxm]<a[i])                    maxm=i;            cout<<"Case "<<t<<":"<<endl;            cout<<a[maxm]<<" "<<maxm+1<<" "<<maxm+1<<endl;;            t++;            if(n)                cout<<endl;            continue;        }        int k=0;        for(int i=0;i<m;i++)        {            if(sum<0)                k=i;            sum=max(0,sum)+a[i];            if(sum>sum_max)            {                st=k;                ed=i;            }            sum_max=max(sum_max,sum);        }        cout<<"Case "<<t<<":"<<endl;        cout<<sum_max<<" "<<st+1<<" "<<ed+1<<endl;;        t++;        if(n)            cout<<endl;    }    return 0;}

第三题是求字母算式的,也挺水的,但一开始理解错了题目的意思,以为都是两位数加两位数。。

Ac代码:

#include<iostream>#include<cstring>#define maxn 10using namespace std;char a[maxn][6],b[maxn][6];int t1,t2,sum;int exchange(char c[]){    if(!strcmp(c,"zero"))        return 0;    if(!strcmp(c,"one"))        return 1;    if(!strcmp(c,"two"))        return 2;    if(!strcmp(c,"three"))        return 3;    if(!strcmp(c,"four"))        return 4;    if(!strcmp(c,"five"))        return 5;    if(!strcmp(c,"six"))        return 6;    if(!strcmp(c,"seven"))        return 7;    if(!strcmp(c,"eight"))        return 8;    if(!strcmp(c,"nine"))        return 9;    return 0;}int main(){    while(1)    {        int asum=0,bsum=0;        t1=t2=0;        sum=0;        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        for(int i=0;i<maxn;i++)        {            cin>>a[i];            if(!strcmp(a[i],"+"))                break;            t1++;        }        for(int i=0;i<maxn;i++)        {            cin>>b[i];            if(!strcmp(b[i],"="))                break;            t2++;        }        if(t1==1&&t2==1&&!strcmp(a[0],"zero")&&!strcmp(b[0],"zero"))            return 0;        for(int i=0;i<t1;i++)        {            asum*=10;            asum+=exchange(a[i]);        }        for(int i=0;i<t2;i++)        {            bsum*=10;            bsum+=exchange(b[i]);        }        sum=asum+bsum;        cout<<sum<<endl;    }    return 0;}

第四题求素数,一开始直接拿学长给的代码用了,换了两种代码,全部TLE。。

后来自己简化求素数流程。只要能不被比自己小的素数整除的数就是素数。。交了一次格式错了。。。

最后改对了。。

Ac代码:

#include <cstdio>#include <cmath>#include <iostream>using namespace std;int p[500050];int is_p(int n,int j){    int i;    int c=sqrt(n);    for(i=0;i<j&&p[i]<=c;i++) if(n%p[i]==0) return 0;    return 1;}int main() {    int m,n;    while(cin>>m>>n)    {        p[0]=2;p[1]=3;p[2]=5;p[3]=7;p[4]=11;        int t=5;        for(int i=12;t<=n;i++)        {            if(is_p(i,t))            {                p[t]=i;                t++;            }        }        t=0;        for(int i=m-1;i<n;i++)        {            cout<<p[i];            t++;            if(t%10==0||i==n-1)                cout<<endl;            else                cout<<" ";        }        cout<<endl;    }    return 0;}

第五题水题,建个数组就好了,比起UVa其他的题差远了。。

Ac代码:

#include <iostream>#include <cstring>#include <cstdlib>#define maxn 35using namespace std;int a[maxn][maxn];int m,n; int is_biggest(int i,int j){    if(i-1>=0&&a[i-1][j]>=a[i][j])        return 0;    if(j-1>=0&&a[i][j-1]>=a[i][j])        return 0;    if(j+1<n&&a[i][j+1]>=a[i][j])        return 0;    if(i+1<m&&a[i+1][j]>=a[i][j])        return 0;    return 1;}int main(){    int first=1;    while(cin>>m>>n)    {        if(first)            first=0;        else            cout<<endl;        memset(a,0,sizeof(a));        for(int i=0;i<m;i++)            for(int j=0;j<n;j++)                cin>>a[i][j];        int t=1;        for(int i=0;i<m;i++)        {            for(int j=0;j<n;j++)            {                if(is_biggest(i,j))                {                    cout<<a[i][j]<<" "<<i+1<<" "<<j+1<<endl;                    t=0;                }            }        }        if(t)            cout<<"None "<<m<<" "<<n<<endl;    }    return 0;}

最后写几句,审题错太可怕。一开始B、C两道题审题错,死活不过,问清楚题目要求之后一次过的。还有求运行效率问题,以后一定要尽量精简代码。

0 0
原创粉丝点击