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\n",s1);
    //printf("翻转后的s2:%s\n",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]='\0';}
            else
            s1[i+1]++;
        }
    }
    strrev(s1);
    //printf("算得的和:%s\n",s1);
    if(compare(s1,m)) printf("YES\n");
    else printf("NO\n");
}
int main()
{
    while(scanf("%s %s %s",n,m,p)!=EOF)
    {
        if(strlen(m)==1&&m[0]-'0'<3) {printf("NO\n");continue;}
        if(strcmp(p,"0")==0)
        {
            if(strcmp(n,m)==0) printf("YES\n");
            else printf("NO\n");
            continue;
        }

        if(compare(n,m)) {printf("YES\n"); continue;}
        if(strlen(p)>strlen(n))
          solve(p,n);
        else solve(n,p);
    }
     return 0;
}


 

 

 

posted @ 2013-07-10 11:11  爱生活,爱编程  阅读(292)  评论(0编辑  收藏  举报