美文网首页
PAT A 1144 1145 1146 1147

PAT A 1144 1145 1146 1147

作者: 大美mixer | 来源:发表于2018-11-22 15:35 被阅读0次

    1144

    一开始用set超时了,改map又好了。
    set 和map 内部结构都采用红黑树的平衡二叉树,而且查找的时候都采用的是二分查找,效率为O(log n),这里很说不通。

    #include<stdio.h>
    #include<map>
    using namespace std;
    
    int main(){
        int n;
        scanf("%d",&n);
        bool flag = false;//记录是否全为0 
        map<int,bool> m;
        for(int i=0;i<n;i++){
            int x;
            scanf("%d",&x);
            if(x>0){
                flag = true;
                m[x] = true;
            } 
        }
        int i = 0;
        if(flag == false){
            printf("1\n"); //全为<=0的数,输出1 
        }else{
            while(++i){
                if(m[i] == false){
                    printf("%d\n",i);
                    break;
                }
            }
        }
    
        return 0;
    }
    

    1145

    题目大意: 先将一堆不同的(distinct)正数 放进一个哈希表。然后从哈希表中找到另个正数序列 ,并输出平均寻找时间(即比较的数量)。哈希表定义:H(key) = key%T , T = 哈希表的最大值。解决冲突的方法:二次探测法(仅具有正增量) ——Quadratic probing
    注:表大小最好是素数(prime) ,假如给的最大值不是素数,那么找到比最大值大的最小的素数

    #include<stdio.h>
    #include<math.h>
    
    int hash_table[10005];
    int msize, n, m;
    
    bool isprime(int n) {
        for (int i = 2; i * i <= n; i++)
            if (n % i == 0) return false;
        return true;
    }
    
    int main(){
        scanf("%d %d %d", &msize, &n, &m);
        
        while(!isprime(msize)){
            msize++;
        }
        
        for(int i=0;i<n;i++){
            int x;
            scanf("%d",&x);
            if(hash_table[x % msize] == 0){
                hash_table[x % msize] = x;
            }else{
                bool flag = false;
                for(int k =1; k < msize; k++){
                    if( hash_table[(x + k*k) % msize] == 0){
                        hash_table[(x + k*k) % msize] = x;
                        flag = true;
                        break;
                    }
                }
                if( flag == false){//未成功插入 
                    printf("%d cannot be inserted.\n", x);
                }
            }
        }
        int sum = 0;
        for(int i=0;i<m;i++){
            int x;
            scanf("%d", &x);
            for(int k = 0; k <= msize; k++){
                sum++;
                if( hash_table[(x + k*k) % msize] == x || hash_table[(x + k*k) % msize] == 0){//找到了或不存在 
                    break;
                }
            }
        }
        printf("%.1f\n", double(sum)/m);
        return 0;
    } 
    

    这题出错的主要点在于对哈希表有所遗忘,导致逻辑错误。

    1146

    topological order:拓扑序
    permutation: 置换

    #include<stdio.h>
    #include<vector>
    using namespace std;
    
    int main(){
        int n, m;
        scanf("%d %d", &n, &m);
        int tree[1005] ={0};
        vector< vector<int> > v(n+1);
        for(int i=0;i<m;i++){
            int start, end;
            scanf("%d %d",&start, &end);
            tree[end]++;
            v[start].push_back(end);
        }
        int k;
        scanf("%d", &k);
        vector<int> ans;
        int count[1005];
        for(int i=0;i<k;i++){
            bool flag = false;
            for(int j=0;j<=n;j++){
                count[j] = tree[j];
            }
            for(int j=0;j<n;j++){
                int x;
                scanf("%d", &x);
                if(flag == false){
                    if( count[x] != 0){
                        flag = true;
                        ans.push_back(i);
                    }else{
                        for(int k = 0; k<v[x].size();k++){
                            count[ v[x][k] ]--;
                        }
                    }
                }
            }
        }
        for(int i=0;i<ans.size();i++){
            if(i != 0){
                printf(" ");
            }
            printf("%d",ans[i]);
        }
        return 0;
    }
    

    1147

    题目大意: 给一个树的层序遍历,判断它是不是堆,是大顶堆还是小顶堆。输出这个树的后序遍历。
    参考柳婼 の blog的代码:

    #include <iostream>
    #include <vector>
    using namespace std;
    int m, n;
    vector<int> v;
    void postOrder(int index) {
        if (index >= n) return;
        postOrder(index * 2 + 1);
        postOrder(index * 2 + 2);
        printf("%d%s", v[index], index == 0 ? "\n" : " ");
    }
    int main() {
        scanf("%d%d", &m, &n);
        v.resize(n);
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) scanf("%d", &v[j]);
            int flag = v[0] > v[1] ? 1 : -1;
            for (int j = 0; j <= (n-1) / 2; j++) {
                int left = j * 2 + 1, right = j * 2 + 2;
                if (flag == 1 && (v[j] < v[left] || (right < n && v[j] < v[right]))) flag = 0;
                if (flag == -1 && (v[j] > v[left] || (right < n && v[j] > v[right]))) flag = 0;
            }
            if (flag == 0) printf("Not Heap\n");
            else printf("%s Heap\n", flag == 1 ? "Max" : "Min");
            postOrder(0);
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:PAT A 1144 1145 1146 1147

          本文链接:https://www.haomeiwen.com/subject/vxslqqtx.html