zoukankan      html  css  js  c++  java
  • 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;
    }

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

  • 相关阅读:
    Azkaban的使用
    Azkaban安装
    Kafka 启动失败,报错Corrupt index found以及org.apache.kafka.common.protocol.types.SchemaException: Error reading field 'version': java.nio.BufferUnderflowException
    Kafka 消费者设置分区策略及原理
    Kafka利用Java API自定义生产者,消费者,拦截器,分区器等组件
    zookeeper群起总是有那么几个节点起不来的问题解决
    flume 启动agent报No appenders could be found for logger的解决
    Flume 的监控方式
    Flume 自定义 组件
    Source r1 has been removed due to an error during configuration java.lang.IllegalArgumentException: Required parameter bind must exist and may not be null & 端口无法连接
  • 原文地址:https://www.cnblogs.com/zibuyu/p/2987773.html
Copyright © 2011-2022 走看看