| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 700 人关注过本帖
标题:哼哼哼!难题,喜欢挑战的进~~
只看楼主 加入收藏
akkabc
Rank: 1
来 自:信宜
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-3-1
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:9 
哼哼哼!难题,喜欢挑战的进~~
在这个问题里,假设有一组文档(其实就是名字而已)。每一个文档都以其中的关键字和关键字的出现频率为特征。

现在输入一组查询资料,包括关键字KEY和额外参数T。对于每一个查询,程序(search.cpp)要列出所有拥有T个关键字KEY的文档名称。

输入/输出模式
整数N (在1到1000之间,说明将会输入的文档数量)
(然后是N行资料,形式如下)
【文档名称】【整数K】(在1到1000之间,说明要输入的关键字数量) 【关键字】【出现频率】  (*N行)
(然后是说明要查询的资料)
【整数Q】(在1到500之间, 要查询的关键字数量)
【关键字KEY】【要求出现频率T >=1】
输出【>】【文件名称】【文件名称】【文件名称】…(频率从小到大排列)
【关键字KEY】【要求出现频率T >=1】
输出【>】【文件名称】【文件名称】【文件名称】…(频率从小到大排列)

(Q行)
搜索更多相关主题的帖子: 挑战 难题 
2010-03-11 13:46
mywaylgh
Rank: 8Rank: 8
来 自:厨房
等 级:蝙蝠侠
威 望:5
帖 子:188
专家分:729
注 册:2010-3-10
收藏
得分:0 
这个用map可以实现
或者用最新标准的 unordered_map

先踩下点,有时间写下

人生就像茶几 上面放着许多杯具

人生也像厨房 里面总有一些洗具
2010-03-11 14:10
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:0 
“所有拥有T个关键字KEY的文档名称”为什么文件名称还要“频率从小到大排列”?T是频率还是什么?
2010-03-11 14:47
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:30 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXBYTE  20
typedef struct _KeyInfo{
    char KeyWord[MAXBYTE];
    int F;
}KeyInfo_t;
typedef struct _filenode{
    char Filename[MAXBYTE];
    int Cnt;
    KeyInfo_t *KIF;
}FileNode_t;

void SearchKeyWord(FileNode_t *fn, int cnt, char *keyword, int f)
{
    int i, j;
    for (i = 0; i < cnt; i ++)
    {
        for (j = 0; j < fn[i].Cnt; j ++)
        {
            if (!strcmp(fn[i].KIF[j].KeyWord, keyword))
            {
                if (fn[i].KIF[j].F == f)
                {
                    printf("%s ", fn[i].Filename);
                }
            }
        }
    }
    printf("\n");
}
int main(void)
{
    int i, j, doc_Cnt;
    scanf("%d", &doc_Cnt);
    FileNode_t *FN = (FileNode_t *)malloc(sizeof(FileNode_t)*doc_Cnt);
    for (i = 0; i < doc_Cnt; i ++)
    {
        scanf("%s", FN[i].Filename);
        scanf("%d", &FN[i].Cnt);
        FN[i].KIF = (KeyInfo_t *)malloc(sizeof(KeyInfo_t)*FN[i].Cnt);
        for (j = 0; j < FN[i].Cnt; j ++)
        {
            scanf("%s", FN[i].KIF[j].KeyWord);
            scanf("%d", &FN[i].KIF[j].F);
        }
        getchar();
    }

    int Search_Cnt, F;
    char keyword[MAXBYTE];
    scanf("%d", &Search_Cnt);
    for (i = 0; i < Search_Cnt; i ++)
    {
        scanf("%s", keyword);
        scanf("%d", &F);
        printf("> ");
        SearchKeyWord(FN, doc_Cnt, keyword, F);
    }
    for (i = 0; i < doc_Cnt; i ++)
    {
        free(FN[i].KIF);
    }
    free(FN);
}
没有加检测错误的代码,还有你那个“频率从小到大排列”我还是闹不明白,明明是频率T怎么又要排呀,汗一下。。。
2010-03-11 15:07
果子蜜健
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-3-11
收藏
得分:0 
那个频率是这样的,比如说有下面几个文件:
a.doc 关键字key出现了10次
b.doc 关键字key出现了5次
c.doc 关键字key出现了3次

然后要求找出关键字key出现了3次的文件,那么输出如下:
> c.doc b.doc a.doc (c文件里的出现频率最少)
2010-03-11 18:10
果子蜜健
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-3-11
收藏
得分:0 
另外,有简单一点的编写方法吗?
2010-03-11 18:14
akkabc
Rank: 1
来 自:信宜
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-3-1
收藏
得分:0 
不好意思,我的表述有点问题!楼上说的对,就是这个意思
2010-03-11 18:38
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:0 
void SearchKeyWord(FileNode_t *fn, int cnt, char *keyword, int f)
{
    int i, j, tmp;
    int *ary1 = NULL,*ary2 = NULL, n = 0;
    for (i = 0; i < cnt; i ++)
    {
        for (j = 0; j < fn[i].Cnt; j ++)
        {
            if (!strcmp(fn[i].KIF[j].KeyWord, keyword))
            {
                if (fn[i].KIF[j].F >= f)
                {
                    n++;
                    ary1 = realloc(ary1, sizeof(int)*n);
                    ary2 = realloc(ary2, sizeof(int)*n);
                    ary1[n-1] = i;
                    ary2[n-1] = j;
                }
            }
        }
    }
    for (i = 0; i < n; i ++)
    {
        for(j = i+1; j < n; j++)
        {
            if (fn[ary1[j]].KIF[ary2[j]].F < fn[ary1[i]].KIF[ary2[i]].F)
            {
                tmp = ary1[i];
                ary1[i] = ary1[j];
                ary1[j] = tmp;
            }
        }
    }
    for (i = 0; i < n; i++)
    {
        printf("%s ", fn[ary1[i]].Filename);
    }
    free(ary1);
    free(ary2);
    printf("\n");
}
2010-03-11 22:25
果子蜜健
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-3-11
收藏
得分:0 
不行啊,不能compile。
2010-03-13 12:39
ldg628
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:3
帖 子:526
专家分:3036
注 册:2009-6-23
收藏
得分:0 
回复 9楼 果子蜜健
可以呀,我用的是gcc,如果你用的是vc的话,把定义的变量放在最前面
2010-03-13 13:33
快速回复:哼哼哼!难题,喜欢挑战的进~~
数据加载中...
 
   



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

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