回 帖 发 新 帖 刷新版面

主题:第54次编程比赛

题目1(60分):对于一个自然数n,可以把它转换成对应的二进制数a[k] a[k-1] ..... a[1] a[0],其

中:n= ∑a[i] * 2^i 而且 a[i]=0 或1 (0=< i < k) , a[k]=1。如:10 转换为1010;5 转换为 101。

我们统计一下a[0]......a[k]这k+1 个数中的0 的个数和1 的个数。如果在这k+1 个数中,0 的个数比1 

个数多,就称n为A类数。给定m,求1~m (包含1,m)中A类数的个数。
函数接口:int solve(int m)
例如:m=3  return 0


题目2(40分):已知n∈Q,则2n+1∈Q,4n+5∈Q;且 1∈Q,求Q中第k小元素。
函数接口:int Q(int k)

判分要求:
1、结果正确得分,错误该题0分。
2、结果正确者,计分方法:该题用时最少者满分,其他按与满分者用时比计算。(例如,第一题最佳时

间1s,某人用时2s,则 1/2*60 = 30)
3、二题得分之和最大者胜出。


格式要求:所有代码包含在参赛者名字的名字空间中。例如:
//名字空间
namespace yxs0001
{
//以下为参赛代码
    int solve(int m)
    {
        return 0;
    }
    int Q(int k)
    {
        return 0;
    }
}




namespace yxs0001
{
    int solve(int m)
    {
        return 0;
    }
    
}
namespace yxs0001
{
    
    int Q(int k)
    {
        return 0;
    }
}

回复列表 (共34个回复)

31 楼


namespace yxs0001
{
int solve(int m)
{
    int count=0;
    int i,j,k,temp,C_0,C_1;;
    long temp1,temp2;
    int Label[33];
    int Wei_Num=0,Lef_Num;
    while(m)
    {
        Label[Wei_Num++]=m%2;
        m/=2;
    }

    for(i=0;i<Wei_Num/2;i++)
    {
        temp=Label[i];
        Label[i]=Label[Wei_Num-1-i];
        Label[Wei_Num-1-i]=temp;
    }

    for(i=3;i<Wei_Num;i++)
    {
        Lef_Num=i-1;
        for(j=i/2+1;j<=Lef_Num;j++)
        {
            temp1=1;
            temp2=1;
            for(k=j;k>=1;k--)
            {
                temp1*=(Lef_Num-k+1);
                temp2*=k;
            }
            count+=temp1/temp2;
        }
    }
    
    C_0=0;
    C_1=0;
    for(i=0;i<Wei_Num;i++)
    {

        if(Label[i]==0)C_0++;
        else C_1++;
    }
    if(C_0>C_1)count++;
    C_0=0;
    C_1=1;
    i=1;

    while(i<Wei_Num)
    {  
        if(Label[i]==0)C_0++;        
        else if(Label[i]==1)
        {  
            Lef_Num=Wei_Num-i-1;
            C_0++;
    
            if(C_0>=Wei_Num/2+1)
            {
                temp1=1;
                for(j=1;j<=Lef_Num;j++)
                    temp1*=2;                    
                count+=temp1;
            }
            else
            {
                for(j=Wei_Num/2+1-C_0;j<=Lef_Num;j++)
                {
                    temp1=1;
                    temp2=1;
                    for(k=j;k>=1;k--)
                    {
                        temp1*=(Lef_Num-k+1);
                        temp2*=k;
                    }
                    count+=temp1/temp2;
                }
            }

            C_0--;
            C_1++;
            
        }
        i++;
    }
    return count;
}
}

32 楼

刚才好像没按要求的名字空间格式,麻烦yxs0001帮忙改一下,谢谢。

33 楼

[code=c]
namespace System64{
   //  subject 1
   #define _INT (8*sizeof(int)-1)

   int value(unsigned n){
        
       int k = _INT+1;
       unsigned i = 1<<_INT;
    
       while( !(n&i) ){
            n <<= 1;
            k--;
            }
       int j = 0,l = 0;
    
       while( k ){
            if( n&i ) j++;
            else   l++;
            n <<= 1;   
            k--;    
            }
    
        return j < l ? 1:0;
    
    }

    int solve(int m){
        if( m <= 3  ) return 0;
    
        int sum = 0;
    
        for(int i=3;i<=m;i++)
        
             sum += value( unsigned(i) );
    
        return sum;        
        }
    // subject 2
    void ShellSort(int s[],int n){
          int d = n;

          while(d>=1){
               d /= 2;        
               int flag;
        
               do{
             
                  flag = 0;
                  for(int i=0;i<n-d;i++){
                        int j = i+d;    
 
                        if( s[j] < s[i] ){
                              int temp = s[j];               
                              s[j] = s[i];               
                              s[i] = temp;
                   
                              flag = 1;
               
                              }
                        }
                 }while( flag );            
               }     
         } 

    int Q(int k){
        int *s = new int[2*k+1];
        int i = 0;
     
        s[i] = 1;
        int j = i;
        i++;
     
        while( i<=(2*k) ){            
              s[i++] = 2*s[j]+1;
            
              if(i > (2*k)) break;
            
              s[i++] = 4*s[j]+5;
            
              j++;            
            
              }     
        ShellSort(s,(2*k+1));
       
        return s[k-1];            
        }
}
[/code]

34 楼

第二题:
namespace latalata
{
int Q(int k)
{   
    int num,Length,Cur_Min;
    int *p=new int[k];
    int *q=new int[k];
    for(int i=0;i<k;i++)
    {    
        *(p+i)=-1;
        *(q+i)=0;

    }
    *p=1;
    num=1;
    Length=1;
    Cur_Min=1;
    while(Length<k)
    {
        for(int i=0;i<Length;i++)
        {
            if(*(q+i)==0)
            {//未加2n+1
                *(p+Length)=2*(*(p+i))+1;
                (*(q+i))++;
                Length++;
                break;
            }
            else if(*(q+i)==1)
            {//未加4n+5
                int Label=i;
                Cur_Min=4*(*(p+i))+5;
                for(int j=i+1;j<Length;j++)
                {
                    if(*(q+j)==0){
                        int temp=2*(*(p+j))+1;
                        if(temp<Cur_Min){
                            Label=j;
                            Cur_Min=temp;
                            j=Length;
                        }
                    }
                }
                *(p+Length)=Cur_Min;
                (*(q+Label))++;
                Length++;
                break;
                
            }
            
        }
    }
    num=*(p+Length-1);
    delete []p;
    delete []q;
    return num;
}

}

我来回复

您尚未登录,请登录后再回复。点此登录或注册