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;
}

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

原文地址:https://www.cnblogs.com/zibuyu/p/2987773.html