回 帖 发 新 帖 刷新版面

主题:[原创][讨论][交流]编程高手的超级训练题解析

[code]
        [[color=FF0000]注意: 这儿绝大部分的题目来源于信息学竞赛!
        这些题目都是非常好的!如果大家能把这些题目做出来,那么可以说你
        的编程能力达到了一定的水平!
        关于这些题目的答案在GOOGLE/BAIDU上都能搜出来,但我:希望大家积极参 与讨论, 如果你把当中的题目做出来了可以贴出来,不过最好是要讲清自己的解题思路!
我也会把自己做出来了的题目以及解题思路发上来和大家一起交流!
         如果你想学好编程,那么实践是很重要的!
         我也是一个编程爱好者![/color]     
  [color=FF00FF]            My dream is to
       develop a better than Linux, Windows more popular than the OS! [/color]        
          有啥问题,可以联系本人: 见我的签名档!
         ]
         
 第二届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题 
             (高中组  竞赛用时:3小时)
             [color=FF00FF] 编号为: gcc_1[/color] 
[/code]
[quote]


1.比赛安排(20分)
    设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n ? 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2 n ? 1天内每个队都与不同的对手比赛。
例如n=2时的比赛安排:
    队         1  2            3  4
    比赛       1==2            3==4             一天
               1==3            2==4             二天
               1==4          2==3             三天





2.数制转换(20分)
    设有一个字符串A$的结构为:  A$=’m<n>p’
    其中m为数字串(长度<=20),而n,p均为1或2位的数字串(其中所表达的内容在2-10之间)。
    程序要求:从键盘上读入A$后(不用正确性检查),将A$中的数字串m(n进制),以p进制的形式输出。
    例如:A$=’48<10>8’
          其意义为:将10进制数48,转换成8进制数输出。
          输出结果为:48<10>=60<8>




3.挖地雷(30分)
    在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。


V1               V 2             V3                       V4                         V5  

例如:
[题目要求]
当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
    输入格式: N:                       (表示地窖的个数)
            W1,W2,W3,……WN     (表示每个地窖中埋藏的地雷数量)
                    A12…………… .     A1N      
                        A23…………..A2N        
                        ……..
                               AN-1  N
    
    输出格式:
      K1--K2--……….KV                  (挖地雷的顺序)
      MAX                            (挖地雷的数量)
例如:

       ⑩--------⑧    ④-----⑦-------⑥

其输入格式为:                   输出:
               5                        1  ?3  -4  -5
10,8,4,7,6            max=27
    1  1  1  0
       0  0  0
          1  1 
             1
 



4.砝码称重(30分)
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),
要求:
    输入方式:a1  a2  a3  a4  a5  a6
             (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
    输出方式:Total=N
             (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
如输入:1_1_0_0_0_0   (注:下划线表示空格)
  输出:TOTAL=3  表示可以称出1g,2g,3g三种不同的重量。


[/quote]

  

回复列表 (共83个回复)

11 楼


[color=FF00FF]GCC-20 部分答案: 供大家参考![/color]

[code]

==========NO.1津津的储蓄计划=========

#include <stdio.h>
int main()
{
  int i,j,k;
  int m[20];
  int yu=0,num=0;
  for(i=1;i<=12;i++)
  scanf("%d",&m[i]);
  k=1;
  while ( k<=12 )
  {
   if(yu+300<m[k])
        {
        j = k;
        break;
        }
   yu+= 300 - m[k];
   if(yu>=100)
   {
    num+=yu/100;
    yu = yu%100;
   }
                        
    k++;
   }
  if(k<=12)
  printf("-%d",j);
  else
  printf("%d\n",num*120+yu);
  return 0;
}

===========NO.2 合并果子=========

#include <stdio.h>
    #include <time.h>
    
    #define MAX 10001
    
    void quick_sort ( long *a, long left, long right)
    {
        long i,j,m,mid,tm;

        i = left;
        j = right + 1;
        mid = (left+right)/2;
        m = a[mid];
        a[mid] = a[left];
        a[left] = m ;

        if ( left < right)
        {
        
        while (1)
        {

        do
        {
        i++;
        }while (a[i] <= m  &&  i <right);
        
        do
        {
        j--;
        }while (a[j] >= m &&   j >left );

        if (i >= j)
        break;
        tm   = a[i] ;
        a[i] = a[j] ;
        a[j] = tm   ;
        
        };
        
        a[left] = a[j];
        a[j] = m ;
        
        if ( left < j-1)
        quick_sort ( a ,left , j-1);
        if ( j+1 < right)
        quick_sort ( a ,j+1, right );
        }
    }

    long two_search (long *a, long pm , long nm , long n)
    {
        long l , r, mid;
        l = nm ;
        r = n ;
        if(nm == n )
        {
        if(pm <= a[n])
        return pm-1;
        else
        return n;
        }
        while (l <= r)
        {
        mid = (l+r)/2;
        if ( (a[mid] < pm && pm < a[mid+1])
                    ||(a[mid] == pm) 
                    || ( mid == n) )
        return mid;
        if (a[mid] < pm )
        l = mid + 1;
        else 
        r = mid - 1;
        }
        
        return 0;
    }  
    int main (int argc , char * argv)
    {
        long h,k,b,min=0,temp;
        long n,a[MAX],num;
        scanf ( "%ld" , &n );
        for( h = 0; h < n; h ++)
        scanf( "%ld" , &a[h]);
        quick_sort( a , 0 , n-1);
        
        temp = a[0]+a[1];
        min += temp;
        for ( b = 2; b < n ; b ++)
        {
        num = two_search (a, temp , b , n-1);
        for (k = b ; k <= num ; k ++)
        a[k-1] = a[k];
        a[num] = temp;
        temp = a[b-1] + a[b];
        min += temp;
        }
        
        printf("%ld\n",min);
        return 0;
    }



[/code]

12 楼

[code]

===========NO.3合唱队形=========
#include<stdio.h>
#include<stdlib.h>
int main()
{
 int N,a[200],b[200],c[200];
 int i,j,k,m,max=1;
 memset(a,0,sizeof(a));
 memset(b,0,sizeof(b));
 memset(c,0,sizeof(c));
 scanf("%d",&N);
 for(i=1;i<=N;i++)
 scanf("%d",&a[i]);

 for(i=1;i<=N;i++)
 {
  for(b[i]=1,j=1;j<i;j++)
  if(a[j]<a[i]&&b[j]+1>b[i])
  b[i]=b[j]+1;
 }

 for(k=N;k>=1;k--)
 {
  for(c[k]=1,m=k+1;m<=N;m++)
  if(a[m]<a[k]&&c[m]+1>c[k])
   c[k]=c[m]+1;
 }

 for(i=1;i<=N;i++)
 if(b[i]+c[i]>max)
 max=b[i]+c[i];
 printf("%d",N-max+1);
 return 0;
}




[/code]

13 楼


[color=FF00FF]GCC-24 :去年的NOIP2006 的题目![/color]

[code]
==========NO.1能量项链==========

#include <stdio.h>
#define MAX 250

int main()
{
    long max=0,i,j,k,r,save;
    long n,a[MAX],m[MAX][MAX];
    scanf("%ld",&n);
    for(i=1 ; i<= n; i ++)
    scanf("%d",&a[i]);
    for(i=1,j=n+1; j<=2*n ; i++,j++)
    a[j] = a[i];
    memset(m,0,sizeof(m));
    
    for (k = 2; k <= n; k++)
        {
    for( i = 1; i <= 2*n-k;i ++)
    {
    j = i+k-1;
    //m[i][j] = m[i][i]+ m[i+1][j] +a[i]*a[i+1]*a[j];
    max=0;
    for(r = i;r < j; r++)
    {
     save = m[i][r]+m[r+1][j]+a[i]*a[r+1]*a[j+1];
     if(save>max)
     max = save;
    }
    m[i][j] = max;
    }
    }
    max=0;
     for(i=1,j=n;i<=n;i++,j++)
    if(m[i][j] > max)
    max = m[i][j];
    printf("%ld",max);

    return 0;
}

///////////////////////////////////////////
NO.1(<0.04s):

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#include<time.h>
#define MAX 200

int main()
{   
    clock_t begin,end;
    FILE *in,*out;
    long m[MAX][MAX],mar[MAX];
    long E,i,j,k,l,n,max;
    memset(m,0,sizeof(m));
    begin=clock();
    in=fopen("D:\\energy10.in","r");
    fscanf(in,"%ld",&n);
     
 for(i=0;i<n;i++)
    fscanf(in,"%ld",&mar[i]);
    fclose(in);
    
 //scanf("%ld",&mar[i]);
 for(k=1;k<n;k++)
     for(i=0;i<n;i++)
     {
       j=i+k;
       max=0;
       for(l=i;l<j;l++)
       {
         max=m[i][l%n]+m[(l+1)%n][j%n]+mar[i]*mar[(l+1)%n]*mar[(j+1)%n];
         if(max>m[i][j%n])
         m[i][j%n]=max;
       }    
     }
    E=m[0][n-1];
    for(i=1,j=0;i<n;i++,j++)
    if(m[i][j]>E)
    E=m[i][j];
    out=fopen("D:\\energy10.result","w");
 fprintf(out,"%ld",E);
    fclose(out);
 end=clock();
    printf("run %f seconds!",(double)(end-begin)/CLOCKS_PER_SEC);
    return 0;
}
    

///////////////////////////////////////////////
NO.2(<0.03s):


#include<stdio.h>
#include<memory.h>
#include<stdlib.h>
#include<time.h>
#define MAX 200

int main()
{
  FILE *in,*out;
  clock_t begin,end;
  long m[2*MAX][2*MAX],mar[2*MAX];
  long i,j,k,h,n,max,E=0;
   
  begin=clock();
  in=fopen("D:\\energy10.in","r");
  fscanf(in,"%ld",&n);
  for(i=1;i<=n;i++)
  fscanf(in,"%ld",&mar[i]);
  fclose(in);
  for(i=n+1,j=1;i<=2*n;i++,j++)
  mar[i]=mar[j];
  for(k=2;k<=n;k++)
    for(i=1;i<=2*n-k;i++)
    {
      j=i+k-1;
      m[i][j]=m[i+1][j]+mar[i]*mar[i+1]*mar[j+1];
      max=0;
      for(h=i+1;h<j;h++)
       {
        max=m[i][h]+m[h+1][j]+mar[i]*mar[h+1]*mar[j+1];
        if(max>m[i][j])
        m[i][j]=max;
       }
      }
      
   out=fopen("D:\\energy10.out","w");
   for(i=1,j=n;i<=n;i++,j++)
   if(m[i][j]>E)
   E=m[i][j];
   fprintf(out,"%ld",E);
   fclose(out);
   end=clock();
   printf("\nRUN %f  seconds !",(double)(end-begin)/CLOCKS_PER_SEC);
   return 0;
}


////////////////////////////////////////////////////////////////////

[/code]

14 楼


[code]
==========NO.2金明的预算方案=========
/* * * ============================================ * * *
     * * *
        金明的预算方案    -------NOIP 2006 第2题
         
    wv[i][j] = max {wv[i-1][j]),  (if end false )
           
            wv[i-1][j- v[i][0]]+ v[i][0]*w[i][0] (j >= v[i]),//0 个附件
           
            wv[i-1][j-v[i][0]-v[i][1]] +v[i][0]*w[i][0]+v[i][0]*w[i][1] 
                            (j>= v[i][0]+v[i][1])//1 个附件
             
            wv[i-1][j-v[i][0]-v[i][1]-v[i][2]] + v[i][0] * w[i][0] + v[i][1]* w[i][1] 
               
            + v[i][2] * w[i][2]  (j >= v[i][0]+v[i][1]+v[i][2]) // 2 个附件
    * * *  ============================================ * * */
    
    #include <stdio.h>
    
    #define MAX_N  3201
    #define MAX_M  101
    
    int main(int argc, char **argv)
    
    {
        long wv[MAX_M][MAX_N];
        long v[MAX_M][3], w[MAX_M][3];
        long flag[MAX_M];
        
        long m, va ,pa,q , N ;
        long i,j,k,h;
        memset(flag , 0, sizeof(flag) );
        memset(wv, 0 , sizeof(wv) );

        scanf("%ld %ld",&N , &m);
        
        i = 0;

        for(h=1 ; h<= m ; h++)
        {
            scanf("%ld %ld %ld",&va,&pa, &q);
            
            if( q > 0 )
            {
                v[q][++flag[q]] = va / 10 ;
                w[q][flag[q]] = pa ;
            }
            else
            {
                v[++i][0] = va / 10;
                w[i][0] = pa ;
            }
            
        }
            
            
        for(i = 1 ; i<= m ; i++)    
        {
            
            wv[i][j] = wv[i-1][j];

            if(flag[i]> 0)
            continue ;
            
            for(j = 1 ; j<= N ; j++)
            {
                k = 0;
                wv[i][j] = wv[i-1][j];
                
                if(wv[i][j] < (k=wv[i-1][j-v[i][0]]+ w[i][0] * v[i][0]) && j >= v[i][0])
                wv[i][j] = k ;
                
                if( flag[i] > 0) /*have sub thing*/
                {

                    if(wv[i][j] < (k=wv[i-1][j-v[i][0]-v[i][1]] 
                        + w[i][0]*v[i][0] + w[i][1]*v[i][1]) && j>= v[i][0]+v[i][1])
                    wv[i][j] = k ;
                    
                    if( flag[i] > 1)
                    {
                    if(wv[i][j] < (k=wv[i-1][j-v[i][0]-v[i][2]]
                        + w[i][0]*v[i][0] + w[i][2]*v[i][2]) && j>= v[i][0]+v[i][2])
                    wv[i][j] = k ;
                    
                    if(wv[i][j] < (k=wv[i-1][j-v[i][0]-v[i][1]-v[i][2]]
                        +w[i][0]*v[i][0]+w[i][1]*v[i][1]+w[i][2]*v[i][2]) 
                        && j >= v[i][0]+v[i][1]+v[i][2] )
                    wv[i][j] = k ;
                    }
                }
            }
        }
                
        printf("%ld\n",wv[m][N]*10);
        
        return 0;
    }
    
[/code]

15 楼


同上:
[code]
//////////////////////////////////////////////////////////// 
#include <assert.h>  (网上COPY)
#include <stdio.h>

typedef struct object_t {
    int price;
    int weight;
    int sub;
    int sub_price[2];
    int sub_weight[2];
    int total;
} OBJECT;

int p = 0;
int g_N;
int f[60][3201];
struct object_t objs[60];

int main(int argc, char *argv[])
{
    FILE *fin, *fout;
    int i, j, k, l, m, n; /* m also used as max */
    int index[60];
    
    fin = fopen("budget.in", "r");
    assert(fin != NULL);
    
    fscanf(fin, "%d", &g_N);
    g_N /= 10;
    fscanf(fin, "%d", &m);
    for (i = 0; i < m; i++) {
        fscanf(fin, "%d %d %d", &j, &k, &l);
        if (l == 0) {    /* main object */
            objs[p].price = j / 10;
            objs[p].weight = j / 10 * k;
            objs[p].sub = 0;
            objs[p].sub_price[0] = objs[p].sub_price[1] = 0;
            objs[p].sub_weight[0] = objs[p].sub_weight[1] = 0;
            objs[p].total = j / 10;
            index[i] = p;
            p++;
        }
        else {
            l--;
            objs[index[l]].sub_price[objs[index[l]].sub] = j / 10;
            objs[index[l]].sub_weight[objs[index[l]].sub] = j / 10 * k;
            objs[index[l]].total += j / 10;
            objs[index[l]].sub++;
        }
    }
    for (i = 0; i < p; i++) objs[p].sub = 2;    
    fclose(fin);
    
    for (i = 0; i <= g_N; i++) {
        if (i >= objs[0].total) {
            m = objs[0].weight;
            if (objs[0].sub >= 1) m += objs[0].sub_weight[0];
            if (objs[0].sub == 2) m += objs[0].sub_weight[1];
            for (j = i; j <= g_N; j++) {
                f[0][j] = m;                
            }
            break;
        }
        
        if (i < objs[0].price) {
            f[0][i] = 0;
            continue;
        }

        m = 0;
        for (j = 0; j <= 3; j++) {
            k = objs[0].sub_weight[0] * (j >> 1) + 
objs[0].sub_weight[1] * (j & 1);
     if ((k > m) && (objs[0].sub_price[0] * (j >> 1)
 + objs[0].sub_price[1] * (j & 1) + objs[0].price <= i)) {
                m = k;
            }
        }
        f[0][i] = objs[0].weight + m;
    }
    
    for (l = 1; l < p; l++) {
        for (i = 0; i <= g_N; i++) {
            m = f[l - 1][i];

            for (j = 0; j <= 3; j++) {
                n = objs[l].sub_price[0] * (j >> 1) 
+objs[l].sub_price[1] * (j & 1) + objs[l].price;
                if (n > i) continue;
                k = objs[l].sub_weight[0] * (j >> 1) 
+ objs[l].sub_weight[1] * (j & 1) + objs[l].weight + f[l - 1][i - n];        
                if (k > m) m = k;
            }
                                
            f[l][i] = m;
        }
    }
    
    fout = fopen("budget.out", "w");
    fprintf(fout, "%d\n", f[p - 1][g_N] * 10);
    fclose(fout);
    
    return 0;
}

[/code]

16 楼


[code]
============NO.3 作业调度方案==========
#include <assert.h>  (网上COPY)
#include <stdio.h>
#include <limits.h>
#include <malloc.h>

typedef struct timegap_t {
    int start, end;
    struct timegap_t * next;
} TIMEGAP;

struct timegap_t * mtime[20];
int last[20];
int proc[20][20][2];    /* (machine, time) */
int curr[20];    /* current proc */
int seq[400];
int m, n;

int main(int argc, char *argv[])
{
    FILE *fin, *fout;
    int i, j;
    struct timegap_t *p, *tmp;
    
    fin = fopen("jsp.in", "r");
    fscanf(fin, "%d %d", &m, &n);
    for (i = 0; i < m * n; i++) {
        fscanf(fin, "%d", &seq[i]);
        seq[i]--;
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            fscanf(fin, "%d", &proc[i][j][0]);
            proc[i][j][0]--;
        }
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            fscanf(fin, "%d", &proc[i][j][1]);
        }
    }
    fclose(fin);
    
    /* initialize */
    for (i = 0; i < m; i++) {
        mtime[i] = malloc(sizeof(struct timegap_t));
        mtime[i]->start = 0;
        mtime[i]->end = INT_MAX;
        mtime[i]->next = NULL;
    }
    for (i = 0; i < n; i++) {
        curr[i] = 0;
        last[i] = 0;
    }
    
    /* simulate */
    for (i = 0; i < m * n; i++) {
        /* current obj = seq[i] */
        /* current proc = curr[seq[i]] */
        /* machine = proc[seq[i]][curr[seq[i]]][0] */
        /* time = proc[seq[i]][curr[seq[i]]][1] */
        
        /* find the 1st suitable time gap */
        p = mtime[proc[seq[i]][curr[seq[i]]][0]];
        do {
            if (p->start == p->end) {
                p = p->next;
                continue;
            }            
            if (p->start >= last[seq[i]] && p->end - p->start >= proc[seq[i]][curr[seq[i]]][1]) {
                break;
            }            
            if (p->start < last[seq[i]] && p->end - last[seq[i]] >= proc[seq[i]][curr[seq[i]]][1]) {
                break;
            }                        
            p = p->next;
        } while (p != NULL);
        assert (p != NULL);
        
        /* separate the time gap */
        if (p->start >= last[seq[i]]) {
            p->start += proc[seq[i]][curr[seq[i]]][1];

            last[seq[i]] = p->start;
            curr[seq[i]]++;
        }
        
        if (p->start < last[seq[i]]) {
            tmp = malloc(sizeof(struct timegap_t));
            tmp->start = last[seq[i]] + proc[seq[i]][curr[seq[i]]][1];
            tmp->end = p->end;
            tmp->next = p->next;
            p->next = tmp;
            p->end = last[seq[i]];

            last[seq[i]] += proc[seq[i]][curr[seq[i]]][1];
            curr[seq[i]]++;
        }
    }
    
    j = 0;
    for (i = 0; i < n; i++) {
        if (last[i] > j) j = last[i];
    }
    
    fout = fopen("jsp.out", "w");
    fprintf(fout, "%d\n", j);
    fclose(fout);
    
    /* free all links */
    for (i = 0; i < m; i++) {
        p = mtime[i];
        while (p != NULL) {
            tmp = p;
            p = p->next;
            free(tmp);
        }
    }

    return 0;
}



 

[/code]

17 楼


[code]
===========NO.4 2k进制数=============
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<memory.h>

#define MAX 1000

long total[MAX],suab[MAX];
long num=0,lab=0;
long k,w;
 
long jinzi_2k(long mod,long jin)
{
 long jin10=1,jin2k=0,i,j,save;
  for(i=mod-1;i>=1;i--)
  {
     save=1;
     for(j=1;j<=i;j++)
     save*=2;
     jin10+=save;
  }
  jin2k=jin10%jin;

  return jin2k;
}

long new_jiecheng(long min,long max,long *sum)
{
  long i,j,h,l,digit=0;

  sum[0]=min;
  for(i=min+1;i<=max;i++)
  {
    for(j=0;j<=digit;j++)
        sum[j]*=i;
    for(h=0;h<=digit;h++)
            if(sum[h]>=10)
     {
       if(sum[digit]>=10)
               digit++;
         sum[h+1]+=sum[h]/10;
         sum[h]=sum[h]%10;

               }
  }

  return digit;
}

int big_bijiao(long *sua,long *sub,long la,long lb)
{
 long i,j;
 for(i=la,j=lb;j>=0&&i>=j;)
 {
  if(sua[i]>sub[j])
  {

   break;
  }
  else if(sua[i]<sub[j])
       {

    break;
    }
    else if(sua[i]==sub[j])
         {
          if(j==0)
          break;
                 j--;
          i--;
          }
 }
 if(sua[i]>sub[j])
 return 1;
 else if(sua[i]<sub[j])
      return -1;

 return 0;
}

void big_chufa(long sua[],long sub[],long la,long lb)
{
  long i,j,h,r,p,q,m,n,laa,len;
  long ab[MAX],sab[MAX],saab[MAX];
  memset(sab,0,sizeof(sab));
  memset(suab,0,sizeof(suab));
  memset(saab,0,sizeof(saab));
  laa=0;
  if(sub[lb]==1&&lb==0)
  {
   for(i=0;i<=la;i++)
   suab[i]=sua[i];
   lab=la;
   }
  else
  {
  for(i=la;i>=lb;i--)
  {
   for(j=0;j<=9;)
   {

    memset(ab,0,sizeof(ab));
    for(h=0;h<=lb;h++)
    ab[h]=sub[h]*j;
    for(r=0;r<lb;r++)
    if(ab[r]>=10)
    {
     ab[r+1]+=ab[r]/10;
     ab[r]=ab[r]%10;
    }
     if(big_bijiao(sua,ab,i,lb)==-1)
     break;
     else
    {
    j++;
    for(m=0;m<=lb;m++)
    sab[m]=ab[m];
    }
   }
   saab[laa++]=j-1;

   for(p=0,q=(lb==0)?i:i-lb;p<=lb;p++,q++)
   {
    if(sua[q]<sab[p])
    {
     sua[q+1]-=1;
     sua[q]+=10;
    }
    sua[q]-=sab[p];
   }
   sua[i-1]+=sua[i]*10;
 }
  len=0;
  while(saab[len]==0)
  {
   len++;
   }
  lab=laa-len-1;
  for(m=0,n=laa-1;m<=lab;m++,n--)
  suab[m]=saab[n];
 }
}



void big_add()
{
 long p,q,r;
 num = num>lab ? num+1 : lab+1;
 for(p=0;p<=num;p++)
 {
  total[p]+=suab[p];
  if(total[p]>=10)
  {
   total[p+1]+=total[p]/10;
   total[p]%=10;
  }
 }
  if(total[num]==0)
  num--;

}

void compute(long n,long m)
{
  long i,j,ma;
  long sua[MAX],sub[MAX],la=0,lb=0;
  memset(sua,0,sizeof(sua));
  memset(sub,0,sizeof(sub));
  memset(suab,0,sizeof(suab));
  lab=0;
  ma=m-n;
 if(m>n)
 {
  if(ma>=n)
  {
    la=new_jiecheng(ma+1,m,sua);
    lb=new_jiecheng(1,n,sub);

  }

  else
   {
     la=new_jiecheng(n+1,m,sua);
     lb=new_jiecheng(1,ma,sub);


  }
      big_chufa(sua,sub,la,lb);
 }
 
else
  {
   lab=0;
   suab[0]=1;
   }
 
}


int main()
{
 
 long h,i,j,l,wu,most=0,mod,m,ma,mb;
 long wei=0,yumax=0;
 scanf("%ld %ld",&k,&w);
   
 most=(long)pow(2,k)-1;
 
if(w%k==0)
  {
   wei=w/k>most?most:w/k;
   for(i=2;i<=wei;i++)
   {
    compute(i,most);
    big_add();
    }
  }
 else if(w%k!=0&&w/k+1>most)
       {
     wei=most;
         for(i=2;i<=wei;i++)
               {
          compute(i,most);
          big_add();
         }
       }
       else if(w%k!=0&&w/k+1<=most)
           {
        wei=w/k+1;
        mod=w%k;
            yumax=jinzi_2k(mod,(long)pow(2,k));
            for(i=2;i<=wei-1;i++)
            {
                    compute(i,most);
                    big_add();
               
            }
                  wu=most-1;
            wei=wei-1;
            for(j=1;wu>=wei&&j<=yumax;j++)
            {

                    compute(wei,wu);
                    big_add();
               wu--;
                   }
                   }
                  
      for(m=num;m>=0;m--)
      printf("%ld",total[m]);
       
      return 0;
}


======================END======================
[/code]

18 楼

[color=FF00FF]GCC-16 部分题目解答:[/color]

[code]

==============NO.1均分纸牌==========
    /* * * *                * * * */
    /* *        name : fenp.c        * * * */
    /* *        zhxdong,15,3, 2007    * * * */
    
    #include <stdio.h>
    
    #define MAX 101
        
    int main(int argc ,char argv[] )
    {
        long a[MAX],b[MAX],N;
        
        long i,j,k1,k2,num=0,sum=0;
        long pin = 0 ;
        memset( a, 0 , sizeof(a) );
        memset( b, 0 , sizeof(b) );
        
        scanf( "%ld",  &N );
        
        for ( i = 1; i <= N ; i ++)
        {
            scanf("%ld", &a[i]);
            sum += a[i];
            b[i]= b[i-1] +a[i] ;
        }
        
        pin = sum / N ;
        
        for (i=1 ; i < N ; )
        {
        if (a[i] == pin )
        i ++;
        
        else
        if (a[i] > pin )
        {
            num ++;
            a[i+1] += a[i] - pin;
            i ++ ;
        }
        
        else
        if (a[i] < pin )
        {
            j = i;
            while (( k1= b[j]) < (k2= j* pin))
            j ++ ;
            
            if ( k1 == k2 )
            {
                num += j-i;
                i = j+1 ;
            }
            
            else
            {
                
                num += j-i+1 ;
                a[j+1] += k1 - k2 ;
                i = j+ 1;
            }
        }
        
        }
        
   printf("%ld\n",num);    
            
   return 0;
    }        

[/code]

19 楼

[code]
=========NO.3自由落体========

      #include <stdio.h>
      #include <math.h>
     int main (int argc , char *argv )
    {
       float h, s1, v , l, k;
       long i, j,n;
       float t1, t2, t11, t22, g = 10.0;
       long num = 0;
       scanf ("%f %f %f %f %f %ld",
 &h, &s1, &v, &l , &k, &n );
                                                                            
 if(v>(long)(v) && v < (long)(v+1))
        {
         printf("%ld\n",num+1);
         return 0;} 
  t11 = sqrt(2*h/g);
 t22 = sqrt(2*(h-k)/g);
                                                                 
  for(i=0; i<= n-1; i++)
  {
    t1 = ((s1-i)/v);
     t2 = ((s1-i+l)/v);
                                                                           
                                                                    
if((t1 <= t11 && t2 >= t22)
|| (fabs(g*t1*t1/2-k)<=1e-5)
||(fabs(g*t2*t2/2-k)<=1e-5) )
num ++;
                                                                   
 }
printf("%ld\n",num);
                
                    
                                                                                              
 /*  end = clock();

                                                 
printf("\nThe program has run %f seconds !\n", 
(double)(end-begin)/1000);*/
 return 0;
        }
=============END======================  
 
[/code]

20 楼

呵呵 lz的头像不错啊,Fvwm~~~

我来回复

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