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条边的蛋糕吗?
大家给威威猫买了一个非常大非常大的蛋糕,蛋糕的形状是一个有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
[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对应的示意图如下:![](http://acm.hdu.edu.cn/data/images/4523-1.jpg)
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; }