• <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 閱讀(323) 評論(0)  編輯 收藏 引用 所屬分類: 算法專題
            合区精品久久久中文字幕一区| 久久久这里只有精品加勒比| 亚洲人成精品久久久久| 亚洲午夜精品久久久久久app| 久久99国产精品久久99小说| 亚洲精品无码久久千人斩| 99久久er这里只有精品18| 亚洲精品无码久久不卡| 久久这里只有精品18| 欧美成a人片免费看久久| 久久婷婷国产麻豆91天堂| 国内精品人妻无码久久久影院导航 | 久久综合久久伊人| 久久棈精品久久久久久噜噜| 久久综合丁香激情久久| 精品一二三区久久aaa片| 亚洲国产日韩欧美久久| 国产亚州精品女人久久久久久 | 久久精品国产亚洲网站| 一本久久a久久精品vr综合| 丰满少妇人妻久久久久久4| 久久久久久久人妻无码中文字幕爆 | 日韩av无码久久精品免费| 久久久无码精品亚洲日韩京东传媒| 99精品久久精品一区二区| 亚洲人成网亚洲欧洲无码久久| 欧美久久久久久午夜精品| 久久久久女教师免费一区| 国产成人精品久久| 热久久国产欧美一区二区精品| 大香伊人久久精品一区二区| 久久无码AV一区二区三区| 国内精品九九久久久精品| 国产精品久久久久久福利69堂| 国产成人精品久久亚洲高清不卡 | 精品无码久久久久久久久久| 精品久久久无码人妻中文字幕| 久久精品国产亚洲AV无码麻豆| 色综合久久久久| www久久久天天com| 亚洲精品国精品久久99热一|