BestCoder No.15 总结

a题:

      比较简单的一个题,就是把两个名字_后面的内容取出来,然后在它们中间加一个small就行了。

代码:

#include
#include
#include
using namespace std;
const int maxn=33;
char str[101],fa[maxn],fb[maxn];
int main()
{
    while(scanf("%s",&str)!=EOF)
    {
        int len=strlen(str),i=0;
        for(i=0;i

b题:

      就是一个编码和解码的过程,需要注意的是判断Error和Set特殊的情况。

代码:

#include
#include
#include
using namespace std;
int n;
void GetBinary(int num,int *a)
{
    for(int i=5;i>=0;i--)
        a[i]=0;
    int cnt=0;
    while(num)
    {
        a[cnt++]=num&1;
        num/=2;
    }
}
int GetNum(int num,char *a)
{
    int ans=0;
    for(int i=num-1;i>=0;i--)
        if(a[i]=='1')
            ans+=1<<(num-1-i);
    return ans;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        if(n)
        {
            char op[20],a[5],b[5];
            int sa,sb;
            scanf("%s",op);
            if(!strcmp(op,"SET"))
            {
                scanf("%1s%d",&a,&sa);
                printf("000110");
                int ans[10];
                GetBinary(sa,ans);
                for(int i=4;i>=0;i--)
                    printf("%d",ans[i]);
                printf("00000");
                printf("\n");
            }
            else
            {
                scanf("%1s%d,%1s%d",&a,&sa,&b,&sb);
                int ans[10];
                if(!strcmp(op,"ADD"))
                    printf("000001");
                else if(!strcmp(op,"SUB"))
                    printf("000010");
                else if(!strcmp(op,"DIV"))
                    printf("000011");
                else if(!strcmp(op,"MUL"))
                    printf("000100");
                else if(!strcmp(op,"MOVE"))
                    printf("000101");
                GetBinary(sa,ans);
                for(int i=4;i>=0;i--)
                    printf("%d",ans[i]);
                GetBinary(sb,ans);
                for(int i=4;i>=0;i--)
                    printf("%d",ans[i]);
                printf("\n");
            }
        }
        else
        {
            char a[20],b[20],c[20];
            scanf("%6s%5s%5s",a,b,c);
            int s=GetNum(6,a);
            int na=GetNum(5,b);
            int nb=GetNum(5,c);
            if(s==0||s>6)
            {
                printf("Error!\n");
                continue;
            }
            if(na&&nb)
            {
                if(s==1)
                    printf("ADD ");
                else if(s==2)
                    printf("SUB ");
                else if(s==3)
                    printf("DIV ");
                else if(s==4)
                    printf("MUL ");
                else if(s==5)
                    printf("MOVE ");
                else
                {
                    printf("Error!\n");
                    continue;
                }
            }
            else if(na)
            {
                if(s!=6)
                {
                    printf("Error!\n");
                    continue;
                }
                printf("SET R%d\n",na);
                continue;
            }
            else
            {
                printf("Error!\n");
                continue;
            }
            printf("R%d,",na);
            printf("R%d\n",nb);

        }
    }
    return 0;
}

c题:

     最开始确实没有发现下标和加起来是一个定值,用Si,j表示第i行第j列的内容,可以得到Sij=t[n-1-i+k]*t[j+n-1-k] (0<=k

代码:

#include
#include
#include
using namespace std;
const int maxn=1000+10;
int n,m,t[maxn*2];
int sum[maxn*3][maxn*2];
int Scan()     //输入外挂
{
     int res=0,ch,flag=0;
     if((ch=getchar())=='-')
         flag=1;
     else if(ch>='0'&&ch<='9')
        res=ch-'0';
    while((ch=getchar())>='0'&&ch<='9')
         res=res*10+ch-'0';
    return flag?-res:res;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(sum,0,sizeof(sum));
        for(int i=0;i<2*n-1;i++)
            t[i]=Scan();
            //scanf("%d",&t[i]);
        for(int i=0;i<2*n-1;i++)
            for(int j=0;i+j<3*n&&j<2*n-1;j++)
                sum[i+j][i]+=t[i]*t[j];
        for(int i=0;i<3*n;i++)
            for(int j=1;j<2*n;j++)
                sum[i][j]+=sum[i][j-1];
        //scanf("%d",&m);
        m=Scan();
        long long ans=0;
        int val=0;
        while(m--)
        {
            int r,c;
            //scanf("%d%d",&r,&c);
            r=Scan();
            c=Scan();
            r=(val+r)%n;
            c=(val+c)%n;
            if(n-1-r==0)
                val=sum[2*(n-1)-r+c][n-1-r+n-1];
            else
                val=sum[2*(n-1)-r+c][n-1-r+n-1]-sum[2*(n-1)-r+c][n-1-r-1];
            /*for(int i=0;i


你可能感兴趣的:(BestCoder,ACM)