作业5

大部分代码从网上看的

  • 6-26 划分整数数组 (20 分)


    int pivotkey,low=0,low0=0,high=n-1,high0=n-1,flag=1,k=n/2,i;
    int s1=0,s2=0;
    while(flag){
        pivotkey=a[low]; //选择枢轴
        while(low<high){  //基于枢轴对数据记性划分
            while(low<high && a[high]>=pivotkey) --high;
            if(low!=high) a[low]=a[high];
            while(low<high && a[low]<=pivotkey) ++low;
            if(low!=high) a[high]=a[low];
        }
        a[low]=pivotkey;
        if(low==k-1) //若枢轴是第n/2个元素,划分成功
        flag=0;
        else if(low<k-1){
            low0=++low;
            high=high0;
        }else{
            high0=--high;
            low=low0;
        }
    } 
    for(i=0;i<k;i++) s1+=a[i];
    for(i=k;i<n;i++) s2+=a[i];
    return s2-s1;
// 参考1https://blog.csdn.net/qq_30091945/article/details/78117562
// 参考2https://andyguo.blog.csdn.net/article/details/106035854
  • 6-27 判断两棵二叉树是否同构(递归法) (10 分)
bool Isomorphism(BiTree T1,BiTree T2)
{   
    if(T1 && !T2) return false;
    
    if(!T1 && T2) return false;
    
    if(!T1 && !T2) return true;

    bool f1 = true,f2 = true;
    f1 = Isomorphism(T1->lchild,T2->lchild);
    f2 = Isomorphism(T1->rchild,T2->rchild);
    return f1 && f2;
}
  • 6-28
int height(AVLTree T)
{
    if(T == NULL) return 0;
    return T->Height;
}

void update(AVLTree T)
{
    int h1 = height(T->Left),h2 = height(T->Right);
    if(h1 > h2){
        T->Height = h1 + 1;
    }else{
        T->Height = h2 + 1;
    }
}

int get_blance(AVLTree T)
{
    int height1 = height(T->Left) - height(T->Right);
    return height1;
}

AVLTree R(AVLTree T)
{
    AVLTree p = T->Left;
    T->Left = p->Right;
    p->Right = T;
    update(T),update(p);
    return p;
}

AVLTree L(AVLTree T)
{
    AVLTree p = T->Right;
    T->Right = p->Left;
    p->Left = T;
    update(T),update(p);
    return p;
}


AVLTree Insert ( int Key, AVLTree T )
{
    if(T == NULL) {
        T = malloc(sizeof(struct AVLNode));
        T->Data = Key;
        T->Left = T->Right = NULL;
    }else if(Key < T->Data){
        T->Left = Insert(Key,T->Left);
        if(get_blance(T) == 2){
            if(get_blance(T->Left) == 1) T = R(T);
            else{
                T->Left = L(T->Left);
                T = R(T);
            }
        }
    }else{
        T->Right = Insert(Key,T->Right);
        if(get_blance(T) == -2){
            if(get_blance(T->Right) == -1) T = L(T);
            else{
                T->Right = R(T->Right);
                T = L(T);
            }
        }
    }
    update(T);
    
    return T;
}
// https://blog.csdn.net/m0_37907797/
  • 6-29
void HeapAdjust( HeapType  H, int s, int m){
	//假设r[s+1..m]已经是堆,将r[s..m]调整为以r[s]为根的大根堆
	KeyType rc;
	int j;
	rc=H.elem[s];
    for(j=2*s;j<=m;j*=2)
	{												//沿key较大的孩子结点向下筛选
		if(j<m&&H.elem[j]<H.elem[j+1]) ++j;		//j为key较大的记录的下标
        if(rc>=H.elem[j]) break;      			//rc应插入在位置s上
		H.elem[s]=H.elem[j]; s=j; 
    }
	H.elem[s]=rc;                          			//插入
} 

  • 6-30
int insertIntoHeap(struct Heap* h, int x){
	if(h->size==h->capacity)
	return 0;
	int i;
	i=++h->size;
	for(;x<h->data[i/2];i/=2)
	{
        h->data[i]=h->data[i/2];
        if (i/2 == 0) break;
    }
	h->data[i]=x;
	return 1;
}
int deleteMin(struct Heap* h, int* pElement){
	if(h->size==0)
	return 0;
	*pElement=h->data[1];
	int temp=h->data[h->size--];
	int parent,child;
	for(parent=1;parent*2<=h->size;parent=child){
		child=parent*2;
		if((child!=h->size)&&(h->data[child]>h->data[child+1]))
		child++;
		if(temp<=h->data[child])
		break;
		else
		h->data[parent]=h->data[child];
	}
	h->data[parent]=temp;
	return 1;
}

  • 7-28
#include <bits/stdc++.h>
using namespace std;

const int N = 2e6 + 10;
int a[N];

int main()
{
    ios::sync_with_stdio(false);
    int n,k;
    cin >> n >> k;
    
    for(int i = 0;i < n;i ++)
        cin >> a[i];
    sort(a,a+n);
    cout << a[n-k] << endl;
    
    return 0;
}
  • 7-29
3    3    4    4    8    8    9    9    
3    2    0    4    8    7    7    9    
5    2    2    6    10   10   7    11   
5    5    6    6    1    10   11   11   
13   13   14   1    1    18   19   19   
13   12   14   14   18   18   17   19   
15   12   12   16   20   17   17   21   
15   15   16   16   20   20   21   21   
  • 7-30
1 2 3 4 5 6 7 8 
2 1 4 3 6 5 8 7 
3 4 1 2 7 8 5 6 
4 3 2 1 8 7 6 5 
5 6 7 8 1 2 3 4 
6 5 8 7 2 1 4 3 
7 8 5 6 3 4 1 2 
8 7 6 5 4 3 2 1 
  • 7-31
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;

int a[N];
int n,k;
int BinarySearch1(int x)
{
    int l = 0,r = n - 1;
    while(l < r){
        int mid = l + r >> 1;
        if(a[mid] < x){
            l = mid + 1;   
        }else{
            r = mid;
        }
    }
    return l;
}


int BinarySearch2(int x)
{
    int l = 0,r = n - 1;
    while(l < r){
        int mid = l + r + 1 >> 1;
        if(a[mid] > x){
            r = mid - 1;   
        }else{
            l = mid;
        }
    }
    return l;
}
int main()
{

    cin >> n >> k;
    for(int i = 0;i < n;i ++) cin >> a[i];
    if(k < a[0]){
        cout << "-1 0" << endl;
    }else if(k > a[n - 1]){
        cout << n - 1 << ' ' << n << endl;
    }else{
        int l1 = BinarySearch1(k);
        int l2 = BinarySearch2(k);
        cout << l2 << ' ' << l1 << endl;
    }
    
    return 0;
}
  • 7-32
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;

int a[N];
int n,k;
typedef long long LL;
int main()
{
    cin >> n;
    for(int i = 0,x;i < n;i ++)
        cin >> x >> a[i];
    sort(a,a+n);
    
    int mid = a[n >> 1];
    LL sum = 0;
    for(int i = 0;i < n;i ++){
        sum += fabs(a[i] - mid);
    }
    cout << sum << endl;

    return 0;
}

/*
1,3,8
4-1+4-3+8-4



*/
  • 7-33
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;

int a[N];
int n,k;
int BinarySearch1(int x)
{
    int l = 0,r = n - 1;
    while(l < r){
        int mid = l + r >> 1;
        if(a[mid] < x){
            l = mid + 1;   
        }else{
            r = mid;
        }
    }
    return l;
}


int BinarySearch2(int x)
{
    int l = 0,r = n - 1;
    while(l < r){
        int mid = l + r + 1 >> 1;
        if(a[mid] > x){
            r = mid - 1;   
        }else{
            l = mid;
        }
    }
    return l;
}
int main()
{
    ios::sync_with_stdio(false);
    
    cin >> n >> k;
    for(int i = 0;i < n;i ++) cin >> a[i];
    if(k < a[0]){
        cout << a[0] << endl;
    }else if(k > a[n - 1]){
        cout << a[n - 1] << endl;
    }else{
        int l1 = BinarySearch1(k);
        int l2 = BinarySearch2(k);
        int f1 = k - a[l2],f2 = a[l1] - k;
        if(f1 <= f2){
            cout << a[l2] << endl;
        }else{
            cout << a[l1] << endl;
        }
    }
    
    return 0;
}
  • 7-34
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 30;

int l[N], r[N], v[N], h[N], idx;

void update(int u)
{
    h[u] = max(h[l[u]], h[r[u]]) + 1;
}

void R(int& u)
{
    int p = l[u];
    l[u] = r[p], r[p] = u;
    update(u), update(p);
    u = p;
}

void L(int& u)
{
    int p = r[u];
    r[u] = l[p], l[p] = u;
    update(u), update(p);
    u = p;
}

int get_balance(int u)
{
    return h[l[u]] - h[r[u]];
}

void insert(int& u, int w)
{
    if (!u) u = ++ idx, v[u] = w;
    else if (w < v[u])
    {
        insert(l[u], w);
        if (get_balance(u) == 2)
        {
            if (get_balance(l[u]) == 1) R(u);
            else L(l[u]), R(u);
        }
    }
    else
    {
        insert(r[u], w);
        if (get_balance(u) == -2)
        {
            if (get_balance(r[u]) == -1) L(u);
            else R(r[u]), L(u);
        }
    }

    update(u);
}

int main()
{
    int n, root = 0;
    cin >> n;

    while (n -- )
    {
        int w;
        cin >> w;
        insert(root, w);
    }

    cout << v[root] << endl;

    return 0;
}
  • 7-35
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>

using namespace std;

void PrintHeap(vector<int>& Minimum_heap);
int main()
{
    int n, k, m;
    scanf("%d%d", &n, &k);//n是堆的容量,需创建一个容量为n的堆。
    //接下来k行,是对这个堆的依次的k项插入或删除操作:用 1 x 表示插入元素x;
    //用 -1 表示删除堆顶。
    vector<int> minHeap_1, minHeap_2;
    make_heap(minHeap_1.begin(), minHeap_1.end(), greater<int>());
    int operate_number, insert_number, i;
    for(i = 0; i < k; i++)
    {
        scanf("%d", &operate_number);
        if(operate_number == 1)
        {
            scanf("%d", &insert_number);
            if((int)minHeap_1.size() < n)//堆满则不能插入元素
            {
                minHeap_1.push_back(insert_number);
                push_heap(minHeap_1.begin(), minHeap_1.end(), greater<int>());
            }
            PrintHeap(minHeap_1);
        }
        else if(operate_number == -1)
        {
            if(!minHeap_1.empty())//堆空不可删除
            {
                pop_heap(minHeap_1.begin(), minHeap_1.end(), greater<int>());
                minHeap_1.pop_back();
            }
            PrintHeap(minHeap_1);
        }
    }
    scanf("%d", &m);
    for(int i = 0; i < m; i++)
    {
        scanf("%d", &insert_number);
        minHeap_2.push_back(insert_number);
    }
    make_heap(minHeap_2.begin(), minHeap_2.end(), greater<int>());
    //这一步尤其关键,执行了这一句后会对vector中所有的元素做调整,使之
    //成为一个最小堆
    PrintHeap(minHeap_2);
    return 0;
}
void PrintHeap(vector<int>& Minimum_heap)
{
    int heap_size = Minimum_heap.size();
    vector<int>::iterator ptr = Minimum_heap.begin();
    for (int i = 1; i < heap_size; i++, ptr++)
    {
        printf("%d ", *ptr);
    }
    printf("%d\n", *ptr);
}


  • 7-36
#include <bits/stdc++.h>
using namespace std;

const int N = 30;
int l[N],r[N],e[N],idx;
int h[N];
int n;

void update(int u)
{
    h[u] = max(h[l[u]],h[r[u]]) + 1;
}

int get_balance(int u)
{
    return h[l[u]] - h[r[u]];
}

void R(int &u)
{
    int p = l[u];
    l[u] = r[p];
    r[p] = u;
    update(u),update(p);
    u = p;
}
void L(int &u)
{
    int p = r[u];
    r[u] = l[p];
    l[p] = u;
    update(u),update(p);//更新高度。
    u = p;
}



void insert(int &u,int val)
{
    if(u == -1) e[idx] = val,u = idx ++;
    else if(val < e[u]){
        insert(l[u],val);
        if(get_balance(u) == 2){
            if(get_balance(l[u]) == 1) R(u);
            else L(l[u]),R(u);
        }
    }else{
        insert(r[u],val);
        if(get_balance(u) == -2){
            if(get_balance(r[u]) != -1) R(r[u]);
            L(u);
        }
    }
    
    update(u);
    
}

int main()
{
    memset(l,-1,sizeof(l));
    memset(r,-1,sizeof(r));
    
    int root = -1;
    cin >> n;
    int a;
    while(n --){
        cin >> a;
        insert(root,a);
    }
    
    cout << e[root] << endl;
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值