• PAT1089. Insert or Merge


    PAT1089. Insert or Merge

    题目大意

    给定一个初始序列src, 一个排序当中的序列tar, 问排序方式是 Insert Sort, 或者 Merge Sort. 并输出下一次迭代排序的序列, 保证答案唯一.

    思路

    由于保证了答案的唯一性, 所以先检测是否是 Insert Sort, 只要检测第一个出现不递增的序列的位置之后, src 和 tar 是否相等.

    如果是 Merge Sort, (需要注意此处的 Merge Sort 不是二分实现的), 需要自己手动模拟 Merge Sort 的过程, 这里考察一个 按照 k 的大小分割一个区间

    	for(int i = 0; i < n / k; i++)
    	    func(i + k, (i + 1) * k);
    	func(n / k * k, n);
    

    代码

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    using namespace std;
    int nNum;
    vector<int> src, tar;
    bool eq(){
        for(int i = 0; i < nNum; i++)
            if(src[i] != tar[i])
                return false;
        return true;
    }
    int main(){
        scanf("%d", &nNum);
        src.resize(nNum); tar.resize(nNum);
        int i, j;
        for(i = 0; i < nNum; i++) cin >> src[i];
        for(i = 0; i < nNum; i++) cin >> tar[i];
    
        for(i = 0; i < nNum - 1 && tar[i] <= tar[i + 1]; i++);
        for(j = i + 1; j < nNum && tar[j] == src[j]; j++);
    
        if(j == nNum){
            cout << "Insertion Sort" << endl;
            sort(src.begin(), src.begin() + i + 2);
        }
        else{
            cout << "Merge Sort" << endl;
            int k = 1, flag = 1;
            while(flag){
                flag = !eq();
                k *= 2;
                for(int i = 0; i < nNum / k; i++)
                    sort(src.begin() + i * k, src.begin() + (i + 1) * k);
                sort(src.begin() + nNum / k * k, src.end());
            }
        }
        for(int i = 0; i < nNum; i++){
            printf("%s%d", i == 0 ? "" : " ", src[i]);
        }
        return 0;
    }
    
    
    
    
  • 相关阅读:
    12个Web开发者应该掌握的Firebug技巧
    sql语句修改表结构
    从数据库中查询数据
    收发短信API
    日志12.03
    监听短信数据库变化
    漫谈C语言及如何学习C语言(转)
    阅读短信
    在src文件中寻找短信数据库表
    拦截短信示例1
  • 原文地址:https://www.cnblogs.com/1pha/p/7905923.html
Copyright © 2020-2023  润新知