现在的位置: 首页 > 综合 > 正文

2013编程之美-测试赛

2012年12月01日 ⁄ 综合 ⁄ 共 3237字 ⁄ 字号 评论关闭
 
题目列表 > A + B
时间限制: 1000ms 内存限制: 1024MB
描述
输入两个正整数A和B, 求A+B的值
输入
两个正整数A, B
输出
A+B的和
对于小数据, 0 < A, B <= 10; 对于大数据, 0 < A, B <= 10100
样例输入
    2 3
样例输出
    5
#include<iostream>  
#include<cstring>  
using namespace std;  
int* strtoint(char *str)  
{  
    int i,len=strlen(str);  
    int* a=new int[(len+1)*sizeof(int)];  
    for(i=0;i<len;i++)  
        a[i]=(int)str[len-i-1]-48;  
    return a;  
}  
char* inttostr(int* a,int n)  
{  
    int i;  
    char* str=new char[(n+1)*sizeof(char)];  
    for(i=0;i<n;i++)  
        str[i]=(char)a[n-i-1]+48;  
    str[n]='\0';  
    return str;  
}  
int check(int* a,int n)  
{  
    int k=0,len=n;  
    while(a[len-1]==0&&len>1)  
        len--;  
    for(k=0;k<len;k++)  
    if(a[k]>=10)  
    {  
       a[k+1]=a[k+1]+a[k]/10;  
       a[k]=a[k]%10;  
    }  
    if(a[k]!=0)  
        len=k+1;  
    return len;  
}  
char* addition(char* m1,char* m2)  
{  
  int i,len1,len2,len,c=0;  
  int* t1,*t2;  
  len1=strlen(m1);  
  len2=strlen(m2);  
  len=(len1>=len2)?len1:len2;  
  t1=new int[(len+2)*sizeof(int)];  
  t2=new int[(len+2)*sizeof(int)];  
  t1=strtoint(m1);  
  t2=strtoint(m2);  
  for(i=len1;i<len+1;i++)  
    t1[i]=0;  
  for(i=len2;i<len+1;i++)  
    t2[i]=0;  
  for(i=0;i<len;i++)  
    t1[i]+=t2[i];  
    len=check(t1,len);  
    return inttostr(t1,len);  
}  
int main()  
{  
    char m1[1000],m2[1000];  
    while(cin>>m1>>m2)  
    cout<<addition(m1,m2)<<endl;  
    return 0;  
} 
题目列表 > 石头剪刀布
时间限制: 1000ms 内存限制: 1024MB
描述
石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期的。请问,小A和小B比了N轮之后,谁赢了?
输入
输入的第一行包含一个整数K,表示K组测试数据。
之后的每组测试数据包含三行。第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。第二行包含NA个整数,表示小A出拳的规律,第三行包含NB个整数,表示小B出拳的规律。其中,0表示“石头”,2表示“剪刀”,5表示“布”。
对于小数据,0 < K,N,NA,NB <= 10;对于大数据,0 < K,N,NA,NB <= 100;
输出
对于每组测试数据,输出一行。如果小A赢了,输出A;如果小B赢了,输出B;如果两人打平,输出draw。
提示
对于第一组测试数据,猜拳过程为:
A:0 2 5 0 2 5 0 2 5 0
B:0 5 0 2 0 5 0 2 0 5
所以A赢了4轮,B赢了2轮,双方打平4轮,所以A赢了。
对于第二组测试数据,猜拳过程为:
A:2 0 5 2 0
B:0 2 5 0 2
所以A赢了2轮,B赢了2轮,双方打平1轮,所以最终打平了。
样例输入
    2
    10 3 4
    0 2 5
    0 5 0 2
    5 3 3
    2 0 5
    0 2 5
样例输出
    A
    draw

#include<stdio.h>
int a[101],b[101];
int main()
{
	int n,t,na,nb,i,ansa,ansb;
	scanf("%d",&t);
	while(t--)
	{
		ansa=ansb=0;
	   scanf("%d %d %d",&n,&na,&nb);
	   for(i=0;i<na;i++)
		   scanf("%d",&a[i]);
	   int j=i;
	   while(j<n)
		{
	      for(i=0;i<na;i++)
			  a[j++]=a[i];
	    }
	   for(i=0;i<nb;i++)
		   scanf("%d",&b[i]);
	      j=i;
	   while(j<n)
		{
	      for(i=0;i<nb;i++)
			  b[j++]=b[i];
	    }
	   for(i=0;i<n;i++)
		{
	      if(a[i]==b[i])
			  continue;
		   else if(a[i]==0)
			{
		      if(b[i]==2)
                 ansa++;
			  else if(b[i]==5)
                  ansb++;
		    }
            else if(a[i]==2)
			{
		      if(b[i]==0)
                 ansb++;
			  else if(b[i]==5)
                  ansa++;
		    }
			 else if(a[i]==5)
			{
		      if(b[i]==2)
                 ansb++;
			  else if(b[i]==0)
                  ansa++;
		    }
	    }
		if(ansa>ansb)
			printf("A\n");
		else if(ansa<ansb)
			printf("B\n");
		else if(ansa==ansb)
			printf("draw\n");
	}
    return 0;
}
/*题目列表 > 踩方格
时间限制: 1000ms 内存限制: 1024MB
描述
有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b. 走过的格子立即塌陷无法再走第二次;
c. 只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。
输入
允许在方格上行走的步数n
输出
计算出的方案数量
对于小数据1 <= n <= 20; 对于大数据1 <= n <= 100.
样例输入
    2
样例输出
    7
*/
#include <stdio.h>
#include <string.h>
#define N 105
char c[N],tem[N];
char res[N][N];
void Add(char* a,char* b)
{
    int la,lb,len,i,r,res,j;
    la = strlen(a);
    lb = strlen(b);
    len = la>lb?la:lb;
    r = 0;
    for (i=0; i<len; i++)
    {
        if (i >= la)
            res = b[lb-i-1]+r-'0';
        else if (i >= lb)
            res = a[la-i-1]+ r-'0';
        else
            res = a[la-i-1]+ b[lb-i-1]+ r-2*'0';
        r = res / 10;
        tem[i] = res %10+'0';
    }
    if (r > 0)
        tem[i++] = r%10+'0';
    for (j = 0; j < i; j++)
        c[j] = tem[i-j-1];
    c[j] = 0;
}
int main()
{
    // freopen("in.txt","r",stdin);
    // freopen("out.txt","w",stdout);
    int n;
    strcpy(res[0],"1");
    strcpy(res[1],"3");
    for (int i = 2; i <= 100; i++)
    {
        Add(res[i-1],res[i-1]);
        strcpy(res[i],c);
        Add(res[i],res[i-2]);
        strcpy(res[i],c);
    }
    while(scanf("%d",&n)!=EOF)
        printf("%s\n",res[n]);
    return 0;
}
 

抱歉!评论已关闭.