| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2847 人关注过本帖
标题:[求助]一道ACM题
只看楼主 加入收藏
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
以下是引用cwande在2006-9-26 21:28:29的发言:

汗,不好意思,你的程序确实在VC中不能运行.....
我的想法其实很简单:
若要满足要求,则整个字符串肯定只能转化为一个句子(字符)..
接着从后往前遍历,....
int count=0;//记录句子的个数,
1.st[i]>='p'&&st[i]<='z',count++;
2.st[i]=C,D,E,I; count--;//因为把两个句子合成了一个句子
3.st[i]=='N',不用处理//句子的个数不变
4.,如果是不符和的字符,
最后判断是否只有一个句子
楼主可以试试,我的算法实现很简单的,不对再讨论(我也不会证明).

PS..一点小建议:
输入可以写成while(gets(string)) ;
最好不要动态开辟内存,很容易出现问题的,偶觉得

这句话能否解释的清楚点?


2006-09-26 21:56
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
4.,如果是不符和的字符,立即退出判断,
最后判断是否只有一个句子
既count=1就是YES,否则是NO.

这有什么不明白的吗?

汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-26 22:03
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
以下是引用cwande在2006-9-26 22:03:05的发言:
4.,如果是不符和的字符,立即退出判断,
最后判断是否只有一个句子
既count=1就是YES,否则是NO.

这有什么不明白的吗?

哦,是这样啊,照你这样说如判断出一个字符串是一个语句,那么其中的字符任意交换后,那还是一个句子哦.
也就是说如果一个字符串是一个语句,那么这个字符串的所有排列均是语句了.

明显不对.
Np是语句,但pN不是啊.


2006-09-26 22:12
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
#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 isLetter(char ch)
{
if(ch<112||ch>122)
{
if(ch!=67&&ch!=68&&ch!=69&&ch!=73)
{
return 0 ;
}
}
return 1 ;
}
int main(void)
{
char string[257]=
{
'\0'
}
;
int i,flag=0,counter=0 ;
while(1)
{
flag=counter=0 ;
gets(string);
if(string[0]=='\0')
break ;
for(i=strlen(string)-1;i>=0;i--)
{
if(string[i]!=78)
{
if(!isLetter(string[i]))
{
printf("NO\n");
flag=1 ;
break ;
}

if(isCaptal(string[i]))
counter--;
else counter++;
}
}
if(counter==1&&flag==0)
printf("YES\n");
if(flag==0&&counter!=1)printf("NO\n");
}
return 0 ;
}
他的代码大致这样,还没定稿,我还得再看看,呵呵,这个想法确实比我的简单得多了,虽然复杂度都是o(n).

对不礼貌的女生收钱......
2006-09-26 22:19
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
哦也对,应该事前对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.出现其余情况就可以跳出循环,
遍历结束以后再进行判断

汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-26 22:21
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
恩,还有pN等情况没处理。

对不礼貌的女生收钱......
2006-09-26 22:23
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
加上判断字符串最后一个是否是'N',应该就行了,有不行的例子吗?
如果有反例,举下,呵呵,谢了。
if(string[strlen(string)-1]=='N')
{
printf("NO\n");
continue;
}

对不礼貌的女生收钱......
2006-09-26 22:39
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
以下是引用soft_wind在2006-9-26 22:19:41的发言:
#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 isLetter(char ch)
{
if(ch<112||ch>122)
{
if(ch!=67&&ch!=68&&ch!=69&&ch!=73)
{
return 0 ;
}
}
return 1 ;
}
int main(void)
{
char string[257]=
{
'\0'
}
;
int i,flag=0,counter=0 ;
while(gets(string))
{
flag=counter=0 ;
// gets(string);
// if(string[0]=='\0')
// break ;
for(i=strlen(string)-1;i>=0;i--)
{
if(string[i]!=78)
{
if(!isLetter(string[i]))
{
printf("NO\n");
flag=1 ;
break ;
}

if(isCaptal(string[i]))
counter--;
else counter++;
}
}
if(counter==1&&flag==0)
printf("YES\n");
if(flag==0&&counter!=1)printf("NO\n");
}
return 0 ;
}

他的代码大致这样,还没定稿,我还得再看看,呵呵,这个想法确实比我的简单得多了,虽然复杂度都是o(n).

还没过吗,改成这样试试,还是感觉你的输入会出问题.....


汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-26 22:40
cwande
Rank: 2
等 级:新手上路
威 望:3
帖 子:333
专家分:0
注 册:2006-8-18
收藏
得分:0 
以下是引用soft_wind在2006-9-26 22:23:08的发言:
恩,还有pN等情况没处理。

3.st[i]=='N'&&count>=1,不用处理//句子的个数不变
不是处理了吗


汗,都懒得写代码了.......... cheat了一个威望,哈.....
2006-09-26 22:41
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
以下是引用soft_wind在2006-9-26 22:23:08的发言:
恩,还有pN等情况没处理。

他的那个方法没根据,改了也不一定对.
还是用你那个二叉树做吧,二叉树好久没看了,都忘了.

我觉得这个题目有点像表达式的语法分析:C,D,E,I就相当于运算符(+,-,*,/之类的)
那个'p'-'z'就相当于操作数.


2006-09-26 22:42
快速回复:[求助]一道ACM题
数据加载中...
 
   



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

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