| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2840 人关注过本帖
标题:[求助]一道ACM题
只看楼主 加入收藏
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
以下是引用cwande在2006-9-26 22:21:53的发言:
哦也对,应该事前对count进行判断,
int count=0;//记录句子的个数,
1.st[i]>='p'&&st[i]<='z',count++;
2.st[i]=C,D,E,I&&count>=2; count--;//因为把两个句子合成了一个句子
3.st[i]=='N'&&count>=1,不用处理//句子的个数不变
4.出现其余情况就可以跳出循环,
遍历结束以后再进行判断
这样就行了?

pppDD行吗?

2006-09-26 22:47
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
可以嘛,输出NO

汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-26 22:50
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 

光判断个数是不行的,其实小写字母连续出现3个或3个以上,就肯定不是语句了.
你的程序能保证吗?


2006-09-26 22:50
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
以下是引用cwande在2006-9-26 22:50:09的发言:
可以嘛,输出NO

代码在那啊?
发出来给我看看


2006-09-26 22:50
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
[CODE]

#include<stdio.h>
#include<string.h>
const int M=1000;
char st[M];
int main()
{
int l,i,j,k;
int mark;
while(scanf("%s",st)!=EOF)
{
l=strlen(st);
k=0;
mark=0;
for(i=l-1;i>=0;i--)
if(st[i]>='p'&&st[i]<='z')
k++;
else if(st[i]=='N'&&k>=1) ;
else if((st[i]=='I'||st[i]=='C'||st[i]=='D'||st[i]=='E')&&k>=2)
k--;
else
{
mark=1;
break;
}
if(k!=1)mark=1;
if(mark==0)printf("YES\n");
else printf("NO\n");
}
return 0;
}

[/CODE]
代码给你了,你自己测一下

汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-26 22:52
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
哦,是倒着判断的.那么DDppp就不行了.

2006-09-26 23:03
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
DDppp本来就是对的嘛
D(Dpp)p

汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-26 23:09
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
暂时没发现错误.不如你去提交一下看看.
我先去睡觉了,明天再来看看.

2006-09-26 23:23
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
以下是引用ww84020209在2006-9-26 23:23:23的发言:
暂时没发现错误.不如你去提交一下看看.
我先去睡觉了,明天再来看看.

 汗,这么不信任偶的算法,虽然偶无法证明,
 不过看起来就觉得很显然是对的...


汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-26 23:38
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
/*原程序*/
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef struct BITREE
{
char data ;
struct BITREE*lchild,*rchild ;
}
BitNode ;
typedef BitNode*element ;
typedef struct STACK
{
element data ;
struct STACK*link ;
}
list_stack ;
int isEmpty(list_stack*stack)
{
if(stack->link)
return 0 ;
else return 1 ;
}
list_stack* InitialStack()
{
list_stack*stack=(list_stack*)malloc(sizeof(list_stack));
stack->link=NULL ;
return stack;
}
void push(list_stack*stack,element num)
{
list_stack*node=(list_stack*)malloc(sizeof(list_stack));
node->data=num ;
node->link=stack->link ;
stack->link=node ;
}
element GetTop(list_stack*stack)
{
if(!isEmpty(stack))
return stack->link->data ;
else return NULL ;
}
void pop(list_stack*stack)
{
if(!isEmpty(stack))
{
list_stack*node=stack->link ;
stack->link=node->link ;
free(node);
}
}
int isCaptal(char ch)
{
unsigned i ;
char obt1[]="CDEI" ;
for(i=0;i<strlen(obt1);i++)
if(ch==obt1[i])
return 1 ;
return 0 ;
}
int main(void)
{
char string[257]=
{
'\0'
}
,str[257]=
{
'\0'
}
;
char ch ;
unsigned i=0,j=0,flag,k=0 ;
list_stack*s=NULL ;
BitNode*p=NULL,*q=NULL ;
while(1)
{
gets(string);
flag=1 ;
if(string[0]=='\0')
break ;
if(string[strlen(string)-1]=='N')
{
printf("NO\n");
continue;
}
for(i=0;i<strlen(string);i++)
{
if(string[i]!='N')
str[j++]=string[i];
}
str[j]='\0' ;
for(i=0;i<strlen(str);i++)
if(str[i]<112||str[i]>122)
{
if(str[i]!=67&&str[i]!=68&&str[i]!=69&&str[i]!=73)
{
printf("NO\n");
flag=0 ;
break ;
}
}
if(flag)
{
k=0 ;
s=InitialStack();
while(1)
{
ch=str[k++];
if(isCaptal(ch))
{
p=(BitNode*)malloc(sizeof(BitNode));
push(s,p);
p->data=ch ;
p=p->lchild ;
}
else
{
p=(BitNode*)malloc(sizeof(BitNode));
p->data=ch ;
p->lchild=p->rchild=NULL ;
if(isEmpty(s)&&k==strlen(str))
{
printf("YES\n");
break ;
}
else if(isEmpty(s))
{
printf("NO\n");
break ;
}
q=GetTop(s);
pop(s);
p=q->rchild ;
}
}
}
j=0 ;
free(s);
s=NULL;
}
return 0 ;
}
/*按照9楼的程序,稍微变动而已*/
#include "stdio.h"
#include "string.h"
int isCaptal(char ch)
{
unsigned i ;
char obt1[]="CDEI" ;
for(i=0;i<strlen(obt1);i++)
if(ch==obt1[i])
return 1 ;
return 0 ;
}
int isN(char ch)
{
if(ch=='N')
return 1;
else return 0;
}
int isLower(char ch)
{
if(ch>='p'&&ch<='z')
return 1;
else return 0;
}
int isLetter(char ch)
{
if(isCaptal(ch)||isN(ch)||isLower(ch))
return 1;
else return 0;
}
int isValue(char ch)
{
if(isLower(ch))
return 1;
else if(isN(ch))
return 0;
else if(isCaptal(ch))
return -1;
}
int main(void)
{
char str[257]=
{
'\0'
}
;
int counter[256]={0};
int i,flag=1;
while(1)
{
flag=1;
gets(str);
for(i=0;i<256;i++)
counter[i]=0;
if(str[0]=='\0')
break ;
for(i=0;i<strlen(str);i++)
{
if(!isLetter(str[i]))
{
printf("NO\n");
flag=0;
break;
}
}
if(flag)
{
if(!isLower(str[strlen(str)-1]))
{
printf("NO\n");
flag=0;
continue;
}
}
if(flag)
{
counter[strlen(str)-1]=1;
for(i=strlen(str)-2;i>=0;i--)
{
counter[i]=counter[i+1]+isValue(str[i]);
if(counter[i]<1)
{
flag=0;
printf("NO\n");
break;
}
}
if(counter[0]==1)
printf("YES\n");
else if(flag) printf("NO\n");
}
}
return 0;
}
我改了我的程序,都能运行了,但提交的时候,超时,估计不是算法太差,而是忽略了某些情况,在某些情况下不能输出,导致延时。
请大家帮忙看看,还有哪种情况忽略了,打印不出结果。

[此贴子已经被作者于2006-9-27 14:13:48编辑过]


对不礼貌的女生收钱......
2006-09-27 13:59
快速回复:[求助]一道ACM题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015765 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved