a题:
比较简单的一个题,就是把两个名字_后面的内容取出来,然后在它们中间加一个small就行了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
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<len;i++)
if(str[i]=='_')
break;
int cnt=0;
for(i++;i<len;i++)
fa[cnt++]=str[i];
fa[cnt]='\0';
scanf("%s",str);
len=strlen(str);
i=cnt=0;
for(i=0;i<len;i++)
if(str[i]=='_')
break;
for(i++;i<len;i++)
fb[cnt++]=str[i];
fb[cnt]='\0';
printf("%s_small_%s\n",fa,fb);
}
return 0;
}
b题:
就是一个编码和解码的过程,需要注意的是判断Error和Set特殊的情况。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
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<n)。然后可以发现n-1-j+k+j+n-1-k=2*(n-1)-i+j是一个定值,所以可以用Sum[i][j]表示下标和为i,在第j行的答案和。则对于Si,j=Sum2*(n-1)-r+c,n-1-r+n-1 - Sum2*(n-1)-r-1。 最后这个题我的代码跑了2800多ms,感觉擦过~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
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<n;i++)
{
//printf("%I64d\n",sum[2*(n-1)-r+c][n-1-r+i]);
val=sum[2*(n-1)-r+c][n-1-r+i];
ans+=val;
} */
ans+=val;
}
printf("%I64d\n",ans);
}
return 0;
}