• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            JulyRina's blog
            welcome to July Rina's blog
            posts - 22,comments - 1,trackbacks - 0
            【練習】
            2.3-2 MERGE的改進
            void MERGE(int *A, int p,int q, int r) {
                int B[maxn] , i = p , j = q+1 , k = 0;
                while(k < r - p + 1) {
                    if(i > q || j <= r && A[i] > A[j]) B[k++] = A[j++];
                    else B[k++] = A[i++];
                }
                for(i=0;i<r-p+1;i++) A[p+i] = B[i];
            }

            2.3-5 二分查找的C++代碼
            int find(int *a, int l, int r, int value) {
                if(l == r) return l;
                int mid = (l+r) >> 1;
                if(a[mid] >= value) return find(a, l, mid, value);
                else return find(a , mid+1, r , value);
            }

            *2.3-7 (這道題其實有O(n)的算法,而且寫起來更方便些)這里是O(nlogn)的算法
            O(nlogn)算法思想:1.首先進行排序;2.然后枚舉每一個小于等于x/2的數S[i],二分查找對應的x-S[i]是否存在
            #include <cstdio>
            #include <cstring>
            #include <iostream>
            #include <algorithm>
            using namespace std;
            const int maxn = 1010;
            bool findx(int *S,int n, int x,int l,int r) {
                if(l > r) return false;
                if(l ==r) return S[l] == x;
                int mid = (l+r) >> 1;
                if(S[mid] >= x) return findx(S, n, x, l, mid);
                else return findx(S, n, x, mid+1, r);
            }
            bool check(int *S,int n,int x) {
                for(int i=0;S[i]<=x/2 && i < n;i++) {
                    if(findx(S, n, x-S[i], i+1, n-1)) return true;
                }
                return false;
            }
            int main() {
                int S[1010] , x , n;
                while(~scanf("%d%d" , &n , &x)) {
                    for(int i=0;i<n;i++) cin >> S[i];
                    if(check(S, n, x)) puts("yes");
                    else puts("no");
                }
                return 0;
            }

            O(n)的方法是在數的范圍不是特別大的時候(或者數的范圍比較大,此時采用hash的方法)標記的方法,這里假設數的范圍<=10000,并且假設數沒有重復的情況下,其他情況稍許改變一下就行:
            #include <cstdio>
            #include <cstring>
            #include <iostream>
            #include <algorithm>
            using namespace std;
            const int maxn = 1010;

            bool check(int *S,int n,int x) {
                bool vis[10001] = {0};
                for(int i=0;i<n;i++) vis[x-S[i]] = true;
                for(int i=0;i<n;i++) if(vis[S[i]]) return true;
                return false;
            }
            int n ,x , S[maxn];
            int main() {
                while(~scanf("%d%d" , &n , &x)) {
                    for(int i=0;i<n;i++) cin >> S[i];
                    if(check(S, n, x)) puts("yes");
                    else puts("no");
                }
                return 0;
            }

            2-4(逆序對):這道題就是在歸并排序中得到逆序對,具體見代碼:
            #include <cstdio>
            #include <cstring>
            #include <iostream>
            #include <algorithm>
            using namespace std;
            const int maxn = 1010;
            int ans;
            void merge_sort(int *A, int l,int r) {
                if(l >= r) return;
                int mid = (l+r) >> 1;
                merge_sort(A, l, mid);
                merge_sort(A, mid+1, r);
                int i = l , j = mid+1 ,B[maxn] , k = l;
                while(i <= mid || j <= r) {
                    if(i > mid || j <= r && A[j] < A[i]) B[k++] = A[j++] , ans += mid-i+1;
                    else B[k++] = A[i++];
                }
                for(i=l;i<=r;i++) A[i] = B[i];
            }
            int main() {
                int A[maxn] , n;
                while(~scanf("%d" , &n)) {
                    for(int i=0;i<n;i++) cin >> A[i];
                    ans = 0;
                    merge_sort(A, 0, n-1);
                    cout << ans << endl;
                    //for(int i=0;i<n;i++) cout << A[i] << " "; cout << endl;
                }
                return 0;
            }
            posted on 2015-03-07 15:19 JulyRina 閱讀(305) 評論(0)  編輯 收藏 引用 所屬分類: 算法專題
            欧美精品丝袜久久久中文字幕 | 欧美亚洲日本久久精品| 国产叼嘿久久精品久久| 日韩久久久久中文字幕人妻 | 九九热久久免费视频| 久久亚洲精品无码VA大香大香| 色欲综合久久躁天天躁蜜桃| 成人免费网站久久久| 亚洲天堂久久久| 一本一道久久精品综合| 久久人人添人人爽添人人片牛牛| 7777久久亚洲中文字幕| 久久这里只有精品首页| 国产高潮久久免费观看| 色综合久久无码中文字幕| 欧美国产成人久久精品| 久久精品国产精品亚洲精品| 亚洲欧美成人综合久久久| 久久久久亚洲AV无码去区首| 99麻豆久久久国产精品免费| 久久精品无码一区二区WWW| 伊人久久大香线蕉精品| 国内精品久久久久伊人av| 午夜精品久久久久久中宇| 久久婷婷色综合一区二区| 久久精品国产福利国产琪琪| 久久无码av三级| 亚洲成人精品久久| 欧美精品一本久久男人的天堂| 精品久久久久久久久午夜福利| 国色天香久久久久久久小说| 2021国内精品久久久久久影院| 久久99九九国产免费看小说| 欧美午夜A∨大片久久 | 91久久成人免费| 色综合久久最新中文字幕| 婷婷久久综合九色综合98| 色综合久久综精品| 久久久久国产视频电影| 日韩久久无码免费毛片软件| 久久综合亚洲鲁鲁五月天|