您的位置:首页 > 其它

hdu 4523 威威猫系列故事——过生日 小模拟

2013-07-10 11:11 148 查看

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

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

2013腾讯编程马拉松初赛第四场(3月24日)

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: