第二次练习赛标程

来源:互联网 发布:剑三丐帮成男捏脸数据 编辑:程序博客网 时间:2024/05/18 01:16

  鉴于渣诚已经发布了第二次练习赛解题报告,所以我只打算留下自己验题时的标程,其中大量应用了STL,某些也没按照题意来做,看下就好。

  A. SubMatrix××

#include<cstdio>#include<cstring>const int MAXN=505;long long sum[MAXN][MAXN];using namespace std;int main(){    int m,n,k,c1,c2,r1,r2;    while(~scanf("%d%d%d",&m,&n,&k))    {        memset(sum,0,sizeof(sum));        for(int i=1; i<=m; ++i)            for(int j=1; j<=n; ++j)            {                scanf("%lld",&sum[i][j]);                sum[i][j]+=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1];            }        while(k--)        {            scanf("%d%d%d%d",&c1,&c2,&r1,&r2);            printf("%lld\n",sum[r2][c2]-sum[r1-1][c2]-sum[r2][c1-1]+sum[r1-1][c1-1]);        }    }}

  B. SubMatrix×××××

#include<cstdio>#include<cstring>const int MAXN=505;int cnt[MAXN][MAXN][10];using namespace std;int main(){    int m,n,q,tmp,x1,y1,x2,y2;    while(~scanf("%d%d%d",&m,&n,&q))    {        memset(cnt,0,sizeof(cnt));        for(int i=1; i<=m; ++i)            for(int j=1; j<=n; ++j)            {                scanf("%d",&tmp);                ++cnt[i][j][tmp];                for(int k=0; k<=9; ++k)                    cnt[i][j][k]+=cnt[i-1][j][k]+cnt[i][j-1][k]-cnt[i-1][j-1][k];            }        while(q--)        {            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);            int ans=0;            for(int i=0; i<=9; ++i)                if(cnt[x2][y2][i]-cnt[x1-1][y2][i]-cnt[x2][y1-1][i]+cnt[x1-1][y1-1][i]>0)                    ++ans;            printf("%d\n",ans);        }    }}

  C. 微软( ⊙ o ⊙ )啊!

#include<cstdio>#include<cstdlib>using namespace std;struct LinkList{    char data;    LinkList *next;};void CreateList(LinkList *&L,int n){    LinkList *s,*r;    L=(LinkList *)malloc(sizeof(LinkList));    r=L;    for(int i=0; i<n; ++i)    {        s=(LinkList *)malloc(sizeof(LinkList));        scanf(" %c",&s->data);        r->next=s;        r=s;    }    r->next=L->next;}void DispList(LinkList *L,int n,int k){    LinkList *p=L->next;    for(int i=0; i<n-k%n; ++i)        p=p->next;    for(int i=0; i<n; ++i)    {        printf("%c",p->data);        p=p->next;    }    putchar('\n');}void DestroyList(LinkList *&L,int n){    LinkList *pre=L,*p=L->next;    for(int i=0; i<n; ++i)    {        free(pre);        pre=p;        p=pre->next;    }    free(pre);}int main(){    int t,n,k;    scanf("%d\n",&t);    while(t--)    {        scanf("%d%d",&n,&k);        LinkList *L;        CreateList(L,n);        DispList(L,n,k);        DestroyList(L,n);    }}
#include<cstdio>#include<list>using namespace std;list<char> data;list<char>::iterator p;int main(){    int t,n,k;    char c;    scanf("%d\n",&t);    while(t--)    {        scanf("%d%d",&n,&k);        for(int i=0; i<n; ++i)        {            scanf(" %c",&c);            data.push_back(c);        }        p=data.begin();        for(int i=0; i<n-k%n; ++i)            ++p;        for(int i=0; i<n; ++i)        {            printf("%c",*p);            ++p;            if(p==data.end())                p=data.begin();        }        putchar('\n');        data.clear();    }}

  D. Who Should I Accompany?(Ⅰ)

#include<cstdio>#include<cstdlib>using namespace std;struct LinkList{    int data;    LinkList *next;};void CreateList(LinkList *&L,int n){    LinkList *s,*r;    L=(LinkList *)malloc(sizeof(LinkList));    r=L;    for(int i=1; i<=n; ++i)    {        s=(LinkList *)malloc(sizeof(LinkList));        s->data=i;        r->next=s;        r=s;    }    r->next=L->next;    L->next=r;}void Josephus(LinkList *&L,int k){    LinkList *p=L->next,*q;    while(p->next!=p)    {        for(int i=1; i<k; ++i)            p=p->next;        q=p->next;        p->next=q->next;        free(q);    }    printf("%d\n",p->data);    free(p);    free(L);}int main(){    int n,k;    while(~scanf("%d%d",&n,&k))    {        LinkList *L;        CreateList(L,n);        Josephus(L,k);    }}
#include<cstdio>#include<list>using namespace std;int main(){    int n,k;    list<int> data;    list<int>::iterator p,q;    while(~scanf("%d%d",&n,&k))    {        for(int i=1; i<=n; ++i)            data.push_back(i);        p=data.begin();        while(data.size()!=1)        {            for(int i=1; i<k; ++i)            {                ++p;                if(p==data.end())                    p=data.begin();            }            q=p++;            if(p==data.end())                p=data.begin();            data.erase(q);        }        printf("%d\n",*p);        data.clear();    }}

  非链表版:

#include<cstdio>int main(){    int n,k;    while(~scanf("%d%d",&n,&k))    {        int s=0;        for(int i=2; i<=n; ++i)            s=(s+k)%i;        printf("%d\n",s+1);    }}

  E. 线性表操作

#include<cstdio>#include<cstdlib>using namespace std;struct SqList{    int data[205],length;};void CreateList(SqList *&L,int n){    L=(SqList *)malloc(sizeof(SqList));    for(int i=0; i<n; ++i)        scanf("%d",&L->data[i]);    L->length=n;}void DispList(SqList *L){    for(int i=0; i<L->length; ++i)        printf("%d ",L->data[i]);    putchar('\n');}bool ListInsert(SqList *&L,int x,int y){    if(x<1||x>L->length+1)        return false;    --x;    for(int i=L->length; i>x; --i)        L->data[i]=L->data[i-1];    L->data[x]=y;    ++L->length;    DispList(L);    return true;}int ListLocate(SqList *L,int x){    int t=0;    while(t<L->length&&L->data[t]!=x)        ++t;    if(t>=L->length)        return 0;    else        printf("%d\n",t+1);    return t+1;}bool ListDelete(SqList *&L,int x){    int t=0;    while(t<L->length&&L->data[t]!=x)        ++t;    if(t>=L->length)        return false;    for(int i=t; i<L->length-1; ++i)        L->data[i]=L->data[i+1];    --L->length;    DispList(L);    return true;}bool GetElem(SqList *L,int x){    if(x<1||x>L->length)        return false;    printf("%d\n",L->data[x-1]);    return true;}int main(){    int n,m;    char order[10];    while(~scanf("%d%d",&n,&m))    {        SqList *L;        CreateList(L,n);        while(m--)        {            int ans,x,y;            scanf("%s%d",order,&x);            switch(order[0])            {            case 'I':                scanf("%d",&y);                ans=ListInsert(L,x,y);                break;            case 'D':                ans=ListDelete(L,x);                break;            case 'L':                ans=ListLocate(L,x);                break;            case 'G':                ans=GetElem(L,x);                break;            }            if(ans==0)                puts("Wrong Input!");        }        free(L);    }}
#include<cstdio>#include<vector>using namespace std;vector<int> data;vector<int>::iterator it;void DispList(){    for(it=data.begin(); it!=data.end(); ++it)        printf("%d ",*it);    putchar('\n');}bool ListInsert(int x,int y){    if(x<1||x>data.size()+1)        return false;    data.insert(data.begin()+x-1,y);    DispList();    return true;}int ListLocate(int x){    for(int i=0; i<data.size(); ++i)        if(data[i]==x)        {            printf("%d\n",i+1);            return i+1;        }    return 0;}bool ListDelete(int x){    for(it=data.begin(); it!=data.end(); ++it)        if(*it==x)        {            data.erase(it);            DispList();            return true;        }    return false;}bool GetElem(int x){    if(x<1||x>data.size())        return false;    printf("%d\n",data[x-1]);    return true;}int main(){    int n,m,tmp;    char order[10];    while(~scanf("%d%d",&n,&m))    {        data.reserve(n+m);        while(n--)        {            scanf("%d",&tmp);            data.push_back(tmp);        }        while(m--)        {            int ans,x,y;            scanf("%s%d",order,&x);            switch(order[0])            {            case 'I':                scanf("%d",&y);                ans=ListInsert(x,y);                break;            case 'D':                ans=ListDelete(x);                break;            case 'L':                ans=ListLocate(x);                break;            case 'G':                ans=GetElem(x);                break;            }            if(ans==0)                puts("Wrong Input!");        }        data.clear();    }}

  F. Plague Inc.

#include<cstdio>#include<list>using namespace std;list<int> data;list<int>::iterator it;int main(){    int n,m,tmp;    while(~scanf("%d",&n))    {        while(n--)        {            scanf("%d",&m);            while(m--)            {                scanf("%d",&tmp);                data.push_back(tmp);            }        }        printf("%d\n",data.size());        for(it=data.begin(); it!=data.end(); ++it)            printf("%d ",*it);        putchar('\n');        data.clear();    }}

  G. Thor’s Necklace

#include<cstdio>#include<algorithm>using namespace std;const int MAXN=1000005;int a[MAXN];int main(){    int n;    while(~scanf("%d",&n))    {        for(int i=0; i<n; ++i)            scanf("%d",&a[i]);        int l=unique(a,a+n)-a;        printf("%d\n",l);        for(int i=0; i<l; ++i)            printf("%d ",a[i]);        putchar('\n');    }}

  最后想说的是,对于一道题而言,AC并不是结束。助教们早已掌握这些方面的知识,但每道题依然会写上不止一种实现以锻炼自己的编码能力,希望童鞋们也能勤学苦练。

0 0