ECJTU&&JXUST 13级新生友谊赛 题解

来源:互联网 发布:地面互动投影软件 编辑:程序博客网 时间:2024/05/13 10:29

A.

/** 此题由于字符串的长度是10^5,所以利用O(n^2)暴力来做的话, 显然是超时的,所以不采用这种方法,我们可以计算每个字符 出现的次数,而题目中 告诉Pairs (x, y) and (y, x) should be considered different,所以组成的个数总和就是 每个字符出现的次数的乘积之和。*/#include<iostream>#include<cstdio>#include<cstring>#include <string>using namespace std;typedef long long ll;int main() {    int num[300]= {0};    string s;    cin>>s;    for(int i=0; i<s.size(); ++i)        ++num[s[i]-'0'];    ll ans=0;    for(int i=0; i<300; ++i) {        ans+=(ll)num[i]*num[i];    }    cout<<ans<<endl;    return 0;}

B

/**  这题是关于字符串的题目,主要注意的地方是输入问题,  用string的话,cin输入遇到空格或者回车都会结束,  所以必须用getline()来进行输入;如果对字符串的  输入还有不懂的,可以参考下面:  http://hi.baidu.com/xun1573/item/5ac7680fad6cdae2f55ba660*/#include <iostream>#include <cstdio>#include <cstring>#include <string>using namespace std;string s;int num[30];int main() {    int t,tcase;    while(scanf("%d",&t)!=EOF) {        tcase=0;        getchar();        while(t--) {            memset(num,0,sizeof(num));            getline(cin,s);            for(int i=0; i<s.size(); i++) {                if(s[i]==' ')continue;                if(s[i]>='A'&&s[i]<='Z')++num[s[i]-'A'];                else if(s[i]>='a'&&s[i]<='z')++num[s[i]-'a'];            }            getline(cin,s);            for(int i=0; i<s.size(); i++) {                if(s[i]==' ')continue;                if(s[i]>='A'&&s[i]<='Z')--num[s[i]-'A'];                else if(s[i]>='a'&&s[i]<='z')--num[s[i]-'a'];            }            int flag=0;            for(int i=0; i<30; i++) {                if(num[i]!=0) {                    flag=1;                    break;                }            }            if(flag) {                printf("Case %d: %s\n",++tcase,"No");            } else {                printf("Case %d: %s\n",++tcase,"Yes");            }        }    }    return 0;}

C

/**  由题目知道luck number是4和7;所以我们可以  采用以四个不同的字母为一个周期,这样他们的  位置相减就会是4,这样就满足了题目要求的意思!  但是因为题目要求是字典序最小,所以是按照abcd这  四个字符组成一个周期。  例如:abcdab  a:1 5  b:2 6  c:3  d:4  因为a:5-1=4;b:6-2=4;  所以采用周期为4!*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;int main() {    int n;    scanf("%d",&n);    for(int i=0,j=0; i<n; ++i,++j) {        if(j==4)j=0;        printf("%c",'a'+j);    }    printf("\n");    return 0;}

D

#include <cstdio>#include <cmath>#include <cstring>using namespace std;char com[15],data[105][55]= {"http://www.lightoj.com/"};int For[105],Bac[105];///模拟题,栈的应用int main() {    int T,tc = 0;    scanf("%d",&T);    while(T--) {        int forward = 0,back = 0,cur = 0,cnt = 0;        printf("Case %d:\n",++tc);        while(scanf("%s",com) && strcmp(com,"QUIT")!=0) {            if(strcmp(com,"VISIT") == 0) {                scanf("%s",data[++cnt]);                Bac[++back] = cur;                cur = cnt;                puts(data[cur]);                forward = 0;            }            if(strcmp(com,"BACK") == 0) {                if(back == 0)                    puts("Ignored");                else {                    For[++forward] = cur;                    cur = Bac[back--];                    puts(data[cur]);                }            }            if(strcmp(com,"FORWARD") == 0) {                if(forward == 0)                    puts("Ignored");                else {                    Bac[++back] = cur;                    cur = For[forward--];                    puts(data[cur]);                }            }        }    }    return 0;}

E

#include <cstdio>#include <cstring>using namespace std;const int N = 10005;char s[N];int main() {    while(scanf("%s",s)!=EOF) {        int idx = -1,sum = 0;        int n = strlen(s);        ///因为要求按字典序排列的下一个串,所以记录 能够把"("变")"的最后一个位置        for(int i = 0; i < n; ++i) {            if(s[i] == '(') {                if(sum >= 1) idx = i;///前面有不少于1个未匹配的"(",当前这个位置可以把"("变成")"                sum++;            } else sum--;        }        if(idx == -1) printf("No solution\n");///没有找到,说明当前的括号串字典序最大        else {            s[idx]=')';///把最后一个可以变"("变成")"            ///前面的部分已经确定,要使剩下的部分字典序最小,则凑成((()))的形式            int x=n/2;            for(int i = 0; i < n; ++i) {                if(s[i] == '(') --x;                if(i>idx)printf("%c",x>0?'(':')'),--x;                else printf("%c",s[i]);            }            printf("\n");        }    }    return 0;}

F

#include<iostream>#include<cstdio>#include<cstring>using namespace std;///模拟题int G[105][105],g[105][105];int main(){    int t,Case=0;    scanf("%d",&t);    while(t--)    {        memset(G,-1,sizeof(G));        int n,m,q;        scanf("%d%d%d",&n,&m,&q);        while(q--)        {            int u,v;            scanf("%d%d",&u,&v);            ++u;            int k=0;            while(G[k+1][u]==-1&&k<n)++k;            G[k][u]=v;        }        int p;        scanf("%d",&p);        while(p--)        {            int d;            scanf("%d",&d);            memset(g,-1,sizeof(g));            if(d==90)            {                for(int i=m;i>=1;--i)                    for(int j=1;j<=n;++j)                    {                        for(int j1=1;j1<=m;++j1)                        if(G[j][j1]!=-1)                        {                            g[i][j]=G[j][j1];                            G[j][j1]=-1;                            break;                        }                    }                swap(n,m);            }            else if(d==180)            {                for(int i=n;i>=1;--i)                    for(int j=1;j<=m;++j)                    {                        for(int i1=1;i1<=n;++i1)                        if(G[i1][m-j+1]!=-1)                        {                            g[i][j]=G[i1][m-j+1];                            G[i1][m-j+1]=-1;                            break;                        }                    }            }            else if(d==270)            {                for(int i=m;i>=1;--i)                    for(int j=1;j<=n;++j)                    {                        for(int j1=m;j1>=1;--j1)                        if(G[n-j+1][j1]!=-1)                        {                            g[i][j]=G[n-j+1][j1];                            G[n-j+1][j1]=-1;                            break;                        }                    }                swap(n,m);            }            for(int i=1;i<=n;++i)                for(int j=1;j<=m;++j)                G[i][j]=g[i][j];        }        printf("%d.\n",++Case);        for(int i=1;i<=n;++i)        {            for(int j=1;j<=m;++j)                if(G[i][j]!=-1)printf("%d",G[i][j]);                else printf(".");            printf("\n");        }    }    return 0;}


0 0
原创粉丝点击