| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1207 人关注过本帖
标题:怎么优化这题不会tle
取消只看楼主 加入收藏
skogt
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2011-5-27
结帖率:0
收藏
 问题点数:0 回复次数:7 
怎么优化这题不会tle
请你设计一个堆,使它具有如下功能:
1.查询( query ) 查询当前堆内最小的数字,并且输出该数字,如果堆为空,则输出"EMPTY";
2.填加( add x ) 表示填加数字x到堆内
3.删除( del )   表示删除当前最小的数字,如果堆为空,则输出"EMPTY"

输入
首先输入一个数字N(1〈=N〈=50000)
然后输入N个指令
query
add x
del

输出
对应每条指令做相应操作


Smaple Input
9
add 2
add 1
query
del
query
del
del
del
query

Sample Output

1
2
EMPTY
EMPTY
EMPTY


搜索更多相关主题的帖子: 优化 设计 query 
2011-09-15 22:22
skogt
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2011-5-27
收藏
得分:0 
回复 2楼 pangding
写出来看看。。
2011-09-17 18:02
skogt
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2011-5-27
收藏
得分:0 
回复 5楼 pangding
我好像是直接数组模拟的==,一开始还以为数据宽点会AC==,这个最小堆没怎么写过。。
程序代码:
#include <iostream>
#include <string>
#include <algorithm>
#include <math.h>

using namespace std;

int a[50005];

int main()
{
    int n;
    int x;
    scanf("%d",&n);
    string str;
    int num = 0;
    memset(a,0,sizeof(a));
    while(n--){
        cin >> str;
        if(str == "add"){
            scanf("%d",&x);
            a[num++] = x;
            sort(a, a + num);
        }else if(str == "query"){
            if(num == 0)    printf("EMPTY\n");
            else printf("%d\n",a[0]);
        }else if(str == "del"){
            if(num == 0)    printf("EMPTY\n");
            else{
                for(int i = 1,j=0; i < num; i++)
                    a[j++] = a[i];
                num--;
            }
        }

    }
    return 0;
} 

2011-09-18 09:21
skogt
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2011-5-27
收藏
得分:0 
回复 7楼 玩出来的代码
en...主要是最小堆从来没写过。。。没办法,只能硬来试试看呃
2011-09-18 19:14
skogt
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2011-5-27
收藏
得分:0 
回复 8楼 pangding
没用过这个STL里面的make_heap()之类的,请以这题写一下,学习了。。
2011-09-18 19:53
skogt
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2011-5-27
收藏
得分:0 
回复 8楼 pangding
程序代码:
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>

using namespace std;

#define N 50005
int heap[N];
int top = 0;

bool cmp(const int &a,const int &b){
    return a > b;
}
int main ()
{ 
    int n;
    scanf("%d",&n);
    string name;
    for(int i = 0; i < n; i++){
        cin >> name;
        if(name == "add"){
            //printf("top==%d\n",top);
            int x;
            cin >> x;
            heap[top++]=x;
            make_heap(&heap[0],&heap[top],cmp);
        }
        else if(name == "query"){
            //printf("top==%d\n",top);
            if(top == 0)    printf("empty\n");
            else{   
            //    sort_heap(&heap[0],&heap[top-1],cmp);
                printf("%d\n",heap[0]);
            }
        }else if(name == "del"){
            //printf("top==%d\n",top);
            if(top == 0)    printf("empty\n");
            else{
                pop_heap(&heap[0],&heap[top],cmp);
                top--;
           
            }
        }
    }

    return 0;
} 

STL里面的heap函数调用效率不是很高啊。。。虽然简单了,但还是tle了
2011-09-18 20:34
skogt
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2011-5-27
收藏
得分:0 
回复 8楼 pangding
有道理
2011-09-18 22:45
skogt
Rank: 1
等 级:新手上路
帖 子:14
专家分:3
注 册:2011-5-27
收藏
得分:0 
回复 12楼 玩出来的代码
直接每次调用push_heap()就行了。。。我水了==
2011-09-18 22:55
快速回复:怎么优化这题不会tle
数据加载中...
 
   



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

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