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条边的蛋糕吗?
大家给威威猫买了一个非常大非常大的蛋糕,蛋糕的形状是一个有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
解题思路: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; }
最后的判断括号 太多,以至于弄混了,错了几次,还有就是比较时不能单纯比较一方