2006 ACM亚洲区域赛西安赛区题目B--Bigger is Better

题目:

基本思路是:
        首先判断能否组成题目要求的数字,显然当n<2m时和n>7m时都是不可能的。
        如果想让这个数字尽量的大,那么就要让他的高位尽量的大,在满足低位能组成完整的数字的情况下。
        我们可以先给所有的位赋值为“9”,这当然是在某个特定的n(n=6m)的情况下的最大的数了,但是,并不一定n就满足这个条件,然后我们就要看n和6m相差多少了。
        如果6m>n,就是有剩余,我们就要考虑使用消耗火柴更多一些的数字,在这里只有8了。为了保证数字的最大,我们在讲数字改小的时候要从最后面开始。这样的话,如果剩余tempn根火柴,我们只要把最后的tempn个数字改成8就行了。
        如果6m        上面关于6m        程序实现如下(没有写文件读写部分,只是实现了算法,因此输入是从键盘输入,输出到显示器): 

# include
# include
main()
{
        char matches[8]={'0','0','1','7','4','5','9','8'};
        int n,m,tempn,tempm,i;
        char *p;
        printf("/nPlease enter the m,n:");
        scanf("%d,%d",&m,&n);
        if ((n<2*m)||(n>7*m))
        {
                printf("/n-1");
                exit(1);
        }
        p=(char*)malloc(m+1);
        p[m]='/0';
        for(i=0;i        tempn=m*6-n;
        if (tempn==0)
        {       printf("/n%s",p);
                exit(1);
         }
        if (tempn<0)
        {
                tempn=abs(tempn);
                for(i=0;i         }
         else
         {
                tempm=tempn/4;
                tempn-=tempm*4;
                for(i=0;i                {
                        p[m-i-1]='1';
                }
                p[m-tempm-1]=matches[6-tempn];
          }
          printf("/n%s",p);
 }

 

你可能感兴趣的:(C/C++,ACM)