hdoj 4523 切蛋糕 腾讯马拉松 大数加法比较

威威猫系列故事——过生日

Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 803    Accepted Submission(s): 210


Problem Description
  2月29号是威威猫的生日,由于这个日子非常特殊,4年才一次,所以生日这天许多朋友都前往威威猫家祝贺他的生日。
  大家给威威猫买了一个非常大非常大的蛋糕,蛋糕的形状是一个有n条边的凸多边形,可是威威猫的审美观有一点奇怪,他只喜欢有m条边的蛋糕,所以他要伙伴们把这个蛋糕切p次,然后给他一个只有m条边的新蛋糕。这下大家急了,这不是坑爹吗,审美观崎岖作怪。
  假设蛋糕可看成一个平面含n条边的凸多边形,每一刀必须沿直线切下去,p刀之后能给威威猫切出一个m条边的蛋糕吗?

 

 

Input
多组测试数据,每组占一行,包含3个整数n, m, p(含义如上)。
[Technical Specification]
3 <= n <= 10^100
0 < m <= 10^100
0 <= p <= 10^100
 

 

Output
每组测试数据,如果能够切出威威猫喜欢的蛋糕,请输出"YES",否则请输出"NO";
每组数据输出一行。
 

 

Sample Input
4 5 1
 
解题思路:1、基于多边形切割的性质,我们可以将目前的多边形一刀切成任意小于目前变数的形状,每一刀最多添加一条边。
              所以基本模型是,n+p 和m的比较,只要n+p大于等于n就行啦
              2、本题需要注意的就是 当m等于1或2时,不能够成立
     3、当p=0时 n等于m就行啦
代码:
View Code
#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define MAX_LEN 100

int an1[MAX_LEN+10];

int an2[MAX_LEN+10];

int an3[MAX_LEN+10];

char szLine1[MAX_LEN+10];

char szLine2[MAX_LEN+10];

char szLine3[MAX_LEN+10];

int main()

{

    int x,y,z,flat;

    int t;

    while(scanf("%s%s%s", szLine1,szLine2,szLine3)!=EOF)

    {

        int i, j;

        memset( an1, 0, sizeof(an1));

        memset( an2, 0, sizeof(an2));

        memset( an3, 0, sizeof(an3));



        int nLen1 = strlen( szLine1);

        for( j = 0, i = nLen1 - 1;i >= 0 ; i --) //由小到大

            an1[j++] = szLine1[i] - '0';



        int nLen2 = strlen(szLine2);

        for( j = 0, i = nLen2 - 1;i >= 0 ; i --)

            an2[j++] = szLine2[i] - '0';



        int nLen3 = strlen(szLine3);

        for( j = 0, i = nLen3 - 1;i >= 0 ; i --)

            an3[j++] = szLine3[i] - '0';



        for( i = 0;i < MAX_LEN ; i ++ ) 

        {  an1[i] += an3[i]; //逐位相加

            if( an1[i] >= 10 ) 

            { //看是否要进位

                an1[i] -= 10;

                an1[i+1] ++; //进位

            }

        }





        for( i = MAX_LEN; (i >= 0) && (an1[i] == 0); i -- ) ;

        x=i;

        for( i = MAX_LEN; (i >= 0) && (an2[i] == 0); i -- ) ;

        y=i;

        for( i = MAX_LEN; (i >= 0) && (an3[i] == 0); i -- ) ;

        z=i;

        if(z==-1)//p等于0时 会退到-1

            z=0;

        flat=1;

        if(y==0&&(an2[0]==1||an2[0]==2))//p等于1或2

            flat=0;

        else

        {

            if(x<y)

                flat=0;

            t=1;//标记是否相等

            if(x==y)

            {

                for(i=x;i>=0;i--)

                    if(an1[i]>an2[i])

                    {    

                        t=0;

                        break;

                    }

                    else if(an1[i]<an2[i])

                    {

                        flat=0;

                        t=0;

                        break;

                    }

            }

        }



        if(flat&&(((z==0&&an3[0]>0)||z>0)  ||(z==0&&an3[0]==0&&t==1) ))

            printf("YES\n");

        else

            printf("NO\n");

    }

    return 0;

}

最后的判断括号 太多,以至于弄混了,错了几次,还有就是比较时不能单纯比较一方

你可能感兴趣的:(腾讯)