検索

ホームページ  >  に質問  >  本文

c++ - 一道hash算法题目

题目描述:给你n个整数,请按从大到小的顺序输出其中前m大的数
输入:每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数
输出:对每组测试数据按从大到小的顺序输出前m大的数

这是我的代码:

只要一运行就报错,一下是报错的情况:

请教大家为什么程序运行不了呢,编译是正确的,十分感谢大家。

怪我咯怪我咯2804日前570

全員に返信(4)返信します

  • 黄舟

    黄舟2017-04-17 14:46:13

    みんながサブジェクトのオープン配列に問題があると言っていたので、サブジェクトのコードを OJ に置いて実行してみます

    追記: 質問者の出力形式には落とし穴がありました。質問者が理解し、最小限の変更を加えられるようにするという原則に従ってコードを改善しました。

    #include 
    #define N 500000
    int main() {
        int n、m;
        int t[1000001];
        while(scanf("%d%d", &n, &m) != EOF) {
            for(int i = 0; i <= 1000000; i++) {
                t[i] = 0;
            }
            while(n--) {
                int x;
                scanf("%d", &x);
                t[x+N]=1;
            }
            int num=0;
            for (int i = 1000000; i>=0; i--) {
                if (num==m) {
                    printf("\n");
                    壊す;
                }
                else if(t[i]==1) {
                    printf("%d", i-N); // ここにはスペースはありません
                    数値++;
                    if (数値 != m){
                        printf(" "); // 最後の出力にはスペースがないため、これはトラップです。
                    }
                }
            }
        }
        0を返します。
    }

    HDU
    < /スパン>

    ナイン ディグリーズ

    <時間>

    タイトルで述べたように、ハッシュ アルゴリズムは並べ替えの問題ではありません。

    これは ACM の基本的な質問です。値をキーとして使用しないように、入力数値に 500000 を加えます。

    出力するときは、値が 0 ではないキーだけを出力します。

    インターネット上には多くの回答があります

    http://www.cnblogs.com/acmer-...

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 14:46:13

    スタック上でそのような大きな配列を開きますか?

    この種の大学院入学試験の質問をする必要はありません。

    返事
    0
  • 黄舟

    黄舟2017-04-17 14:46:13

    1. t をヒープに定義します。
    2. n と m を入力して、サイズの関係を判断します。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 14:46:13

    配列が大きすぎる場合、スタックが爆発する可能性が非常に高くなります。 new を使用して配列を適用してみることができます。

    返事
    0
  • キャンセル返事