杂文 ZOJ问题 hdoj 3788
2014-08-13 19:49
351 查看
/*
ZOJ问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2669 Accepted Submission(s): 812
Problem Description
对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC。
是否AC的规则如下:
1. zoj能AC;
2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空;
3. 若azbjc 能AC,则azbojac也能AC,其中a,b,c为N个'o'或者为空;
Input
输入包含多组测试用例,每行有一个只包含'z','o','j'三种字符的字符串,字符串长度小于等于1000;
Output
对于给定的字符串,如果能AC则请输出字符串“Accepted”,否则请输出“Wrong Answer”。
Sample Input
zoj
ozojo
ozoojoo
oozoojoooo
zooj
ozojo
oooozojo
zojoooo
Sample Output
Accepted
Accepted
Accepted
Accepted
Accepted
Accepted
Wrong Answer
Wrong Answer
Source
浙大计算机研究生复试上机考试-2010年
*/
/*20140813 19:40*/
/*在没有找到规律之前,测试数据都对,但是就是一直WA,不知道为什么
*/
/*
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#define M 1000
char s[M];
int jude1(char a[])
{
if(strcmp(a,"zoj")==0)
return 1;
else
return 2;
}
int jude2(char a[])
{
char b[M];
int la=0,count1=0,count2=0,count3=0;
int i=0,j=0,k=0;
la=strlen(a)-1;
while(a[i++]=='o')
count1++;
while(a[la--]=='o')
count2++;
memset(b,0,sizeof(b));
for(j=i-1,k=0;j<=la+1;j++)
{
b[k++]=a[j];
}
b[k+1]='\0';
if(strlen(b)<=3)
{
if(jude1(b)&&(count1==count2))
return 1;
else
return 0;
}
else
{
for(i=0,count3=0;i<strlen(b);i++)
{
if(b[i]=='o')
count3++;
}
if(2*count1==count2&&(count3>=count1))
return 1;
else
return 0;
}
}
int jude3(char a[])
{
int i=0,j=0,l,k;
l=strlen(a)-1;
while(a[i++]=='o')
;
while(a[l--]=='o')
;
int p1=0,p2=0;
for(j=i-1;j<=l+1;j++)
{
if(a[j]=='z')
p1++;
if(a[j]=='j')
p2++;
}
if(a[i-1]=='z'&&a[l+1]=='j'&&p1==1&&p2==1)
return 1;
else
return 0;
}
int main()
{
memset(s,0,sizeof(s));
while(~scanf("%s",s))
{
int n1,n2,n3,len=0;
n1=jude1(s);
n2=jude2(s);
n3=jude3(s);
len=strlen(s);
if(len<=3)
{
if(n1&&n3)
printf("Accepted\n");
else
printf("Wrong Answer\n");
}
else
{
if(n2&&n3)
printf("Accepted\n");
else
printf("Wrong Answer\n");
}
}
return 0;
}
*/
/*
条件二和条件三要结合起来理解,最后会发现如下规律:
设:
a = 第一个z前o的个数
b = 夹在z和j之间的o的个数
c = 第一个j之后的o的个数
则有条件二三有:a,b,c满足a*b=c
而条件二的xzojx也刚好满足上述条件
另外要注意几点,那就是
1、b>0,例如输入 zj,输出应该为WA而不是AC
2、必须是z在j的前面;
3、z和j只能出现一次;
*/
/*AC*/
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#define M 1010
char s[M];
int main()
{
memset(s,0,sizeof(s));
while(~scanf("%s",s))
{
int i,j,k,l;
int a=0,b=0,c=0;
l=strlen(s)-1;
i=0,a=0;
while(s[i++]=='o')//计算z之前的o的个数
a++;
c=0;
while(s[l--]=='o')//计算j之后的o的个数
c++;
int p1=0,p2=0;
for(j=i-1,b=0;j<=l+1;j++)//这一步不可少,判断z和j 的个数,需要注意边界;
{
if(s[j]=='z')
p1++;
if(s[j]=='o')
b++;
if(s[j]=='j')
p2++;
}
if(s[i-1]=='z'&&s[l+1]=='j') //必须满足z在前,j在后,此步骤是题目的一大坑;还需注意边界
{
if(b>0&&b*a==c&&(p1==1)&&(p2==1))//z和j的个数必须都满足有且仅有一个;
printf("Accepted\n");
else
printf("Wrong Answer\n");
}
else
printf("Wrong Answer\n");
}
return 0;
}
ZOJ问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2669 Accepted Submission(s): 812
Problem Description
对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC。
是否AC的规则如下:
1. zoj能AC;
2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空;
3. 若azbjc 能AC,则azbojac也能AC,其中a,b,c为N个'o'或者为空;
Input
输入包含多组测试用例,每行有一个只包含'z','o','j'三种字符的字符串,字符串长度小于等于1000;
Output
对于给定的字符串,如果能AC则请输出字符串“Accepted”,否则请输出“Wrong Answer”。
Sample Input
zoj
ozojo
ozoojoo
oozoojoooo
zooj
ozojo
oooozojo
zojoooo
Sample Output
Accepted
Accepted
Accepted
Accepted
Accepted
Accepted
Wrong Answer
Wrong Answer
Source
浙大计算机研究生复试上机考试-2010年
*/
/*20140813 19:40*/
/*在没有找到规律之前,测试数据都对,但是就是一直WA,不知道为什么
*/
/*
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#define M 1000
char s[M];
int jude1(char a[])
{
if(strcmp(a,"zoj")==0)
return 1;
else
return 2;
}
int jude2(char a[])
{
char b[M];
int la=0,count1=0,count2=0,count3=0;
int i=0,j=0,k=0;
la=strlen(a)-1;
while(a[i++]=='o')
count1++;
while(a[la--]=='o')
count2++;
memset(b,0,sizeof(b));
for(j=i-1,k=0;j<=la+1;j++)
{
b[k++]=a[j];
}
b[k+1]='\0';
if(strlen(b)<=3)
{
if(jude1(b)&&(count1==count2))
return 1;
else
return 0;
}
else
{
for(i=0,count3=0;i<strlen(b);i++)
{
if(b[i]=='o')
count3++;
}
if(2*count1==count2&&(count3>=count1))
return 1;
else
return 0;
}
}
int jude3(char a[])
{
int i=0,j=0,l,k;
l=strlen(a)-1;
while(a[i++]=='o')
;
while(a[l--]=='o')
;
int p1=0,p2=0;
for(j=i-1;j<=l+1;j++)
{
if(a[j]=='z')
p1++;
if(a[j]=='j')
p2++;
}
if(a[i-1]=='z'&&a[l+1]=='j'&&p1==1&&p2==1)
return 1;
else
return 0;
}
int main()
{
memset(s,0,sizeof(s));
while(~scanf("%s",s))
{
int n1,n2,n3,len=0;
n1=jude1(s);
n2=jude2(s);
n3=jude3(s);
len=strlen(s);
if(len<=3)
{
if(n1&&n3)
printf("Accepted\n");
else
printf("Wrong Answer\n");
}
else
{
if(n2&&n3)
printf("Accepted\n");
else
printf("Wrong Answer\n");
}
}
return 0;
}
*/
/*
条件二和条件三要结合起来理解,最后会发现如下规律:
设:
a = 第一个z前o的个数
b = 夹在z和j之间的o的个数
c = 第一个j之后的o的个数
则有条件二三有:a,b,c满足a*b=c
而条件二的xzojx也刚好满足上述条件
另外要注意几点,那就是
1、b>0,例如输入 zj,输出应该为WA而不是AC
2、必须是z在j的前面;
3、z和j只能出现一次;
*/
/*AC*/
#include<cstdio>
#include<string.h>
#include<stdlib.h>
#define M 1010
char s[M];
int main()
{
memset(s,0,sizeof(s));
while(~scanf("%s",s))
{
int i,j,k,l;
int a=0,b=0,c=0;
l=strlen(s)-1;
i=0,a=0;
while(s[i++]=='o')//计算z之前的o的个数
a++;
c=0;
while(s[l--]=='o')//计算j之后的o的个数
c++;
int p1=0,p2=0;
for(j=i-1,b=0;j<=l+1;j++)//这一步不可少,判断z和j 的个数,需要注意边界;
{
if(s[j]=='z')
p1++;
if(s[j]=='o')
b++;
if(s[j]=='j')
p2++;
}
if(s[i-1]=='z'&&s[l+1]=='j') //必须满足z在前,j在后,此步骤是题目的一大坑;还需注意边界
{
if(b>0&&b*a==c&&(p1==1)&&(p2==1))//z和j的个数必须都满足有且仅有一个;
printf("Accepted\n");
else
printf("Wrong Answer\n");
}
else
printf("Wrong Answer\n");
}
return 0;
}
相关文章推荐
- HDOJ ZOJ问题 3788
- HDOJ-3788 ZOJ问题(递推)
- ZOJ问题(2010浙江大学研究生复试上机题目[找规律] hdoj 3788)
- HDOJ 3788 ZOJ问题(观察推断题)
- hdoj 3788 zoj问题
- HDOJ 题目 3788 ZOJ问题(水题)
- ZOJ问题(2010浙江大学研究生复试上机题目[找规律] hdoj 3788)
- HDOJ 3788 zoj问题【规律题】
- HDOJ 3788 ZOJ问题 (字符串)
- hdoj 3788 zoj问题(递推)
- hdu-3788-ZOJ问题
- hdu 3788 ZOJ问题
- ZOJ问题(杭电3788)
- hdu 3788 zoj问题
- HDU 3788 ZOJ问题
- HDU 3788 ZOJ问题
- hdu 3788 zoj问题
- HDU 3788 ZOJ问题
- hdu 3788 ZOJ问题
- 【杭电oj】3788 - ZOJ问题(坑)