zoukankan      html  css  js  c++  java
  • hdu 4523 威威猫系列故事——过生日 小模拟

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

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

    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
     
    Sample Output
    YES
    Hint
    Sample对应的示意图如下:
     
    Source
     
    Recommend
    liuyiding
     


    思路:

    很容易可以看出  一刀可以增加一条边    或者不变(不增加)

    一刀也可以减少1到n-3条边

    所以易知  

    如果  m小于3 NO

    如果 m 大于等于3小于等于n YES

    如果m大于n  并且p+n大于等于m 输入YES   否则NO

    #include<stdio.h>
    #include<string.h>
    char n[111],m[111],p[111],mid[111];
    int compare(char *s1,char *s2)//判断第一个是否大于等于第二个
    {
          int len1=strlen(s1);
          int len2=strlen(s2);
          if(len1>len2) return 1;
          else if(len1<len2) return 0;
          for(int i=0;i<len1;i++)
          {
              if(s1[i]>s2[i]) return 1;
              else if(s2[i]>s1[i]) return 0;
          }
          return 1;
    }
    void solve(char *s1,char *s2)//求出a+p的值与m进行大小比较
    {
        int len=strlen(s2);
        int len1=strlen(s1);
        strrev(s1);
        strrev(s2);
        //printf("翻转后的s1:%s
    ",s1);
        //printf("翻转后的s2:%s
    ",s2);
        for(int i=0;i<len;i++)
        {
            s1[i]=s1[i]-'0'+s2[i]-'0'+'0';
        }
       // puts(s1);
        for(int i=0;i<len1;i++)
        {
            if(s1[i]>'9')
            {
                s1[i]=s1[i]-10;
                if(i+1==len1) {s1[len1]='1';s1[len1+1]='';}
                else
                s1[i+1]++;
            }
        }
        strrev(s1);
        //printf("算得的和:%s
    ",s1);
        if(compare(s1,m)) printf("YES
    ");
        else printf("NO
    ");
    }
    int main()
    {
        while(scanf("%s %s %s",n,m,p)!=EOF)
        {
            if(strlen(m)==1&&m[0]-'0'<3) {printf("NO
    ");continue;}
            if(strcmp(p,"0")==0)
            {
                if(strcmp(n,m)==0) printf("YES
    ");
                else printf("NO
    ");
                continue;
            }
    
            if(compare(n,m)) {printf("YES
    "); continue;}
            if(strlen(p)>strlen(n))
              solve(p,n);
            else solve(n,p);
        }
         return 0;
    }
    


     

  • 相关阅读:
    203. Remove Linked List Elements
    86. Partition List
    143. Reorder List
    876. Middle of the Linked List
    246. Strobogrammatic Number
    202. Happy Number
    数据类型转换
    表达式
    面向对象
    对齐
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3181688.html
Copyright © 2011-2022 走看看