PTA甲级前的临阵磨枪

1.偷偷转载大佬对于考点的分布及汇总整理

链接:https://www.cnblogs.com/jlyg/p/7525244.html

2.根据考点复习的算法。

(1)快排

#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1005
int a[maxn],n;
void quicksort(int left,int right)
{
    if(left>right)
        return;
    int temp = a[left];
    int i = left;
    int j = right;
    while(i!=j)
    {
        while(a[j]>=temp&&i<j)// 1
            j--;
        while(a[i]<=temp&&i<j)// 2 
            i++;
        if(i<j)               //1 2 顺序不能换
            swap(a[i],a[j]);
    }
    a[left] = a[i];
    a[i] = temp;
    quicksort(left,i-1);
    quicksort(i+1,right);
}
int main()
{
    scanf("%d",&n);
    for(int i = 0; i < n; i ++)
        scanf("%d",&a[i]);
    quicksort(0,n-1);
    for(int i = 0; i < n; i ++)
        printf("%d ",a[i]);
}

(2)插入排序

 #include<iostream>
 #include<algorithm>
 using namespace std;
 #define maxn 1005
 int n,a[maxn];
 void insertsort()
 {
     for(int i = 0; i < n; i ++)
     {
         int temp = a[i];
         int j = i - 1;
         while(j>=0&&a[j]>temp)
        {
            a[j+1] = a[j];
             j--;
        }
        a[j+1] = temp;
    }
 }
 int main()
 {
     scanf("%d",&n);
     for(int i = 0; i < n; i ++)
        scanf("%d",&a[i]);
    insertsort();
    for(int i = 0; i < n; i ++)
        printf("%d ",a[i]);
 }

3.dirjstra

#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1005
#define inf 0x3f3f3f
int map[maxn][maxn],dis[maxn],vis[maxn],n,m;
void dijkastra(int s)//s为起点
{
    for(int i = 1; i < n; i ++)
        dis[i] = inf;
    dis[s] = 0;
    for(int i = 0 ; i < n ; i ++)
    {
        int min,mindis = inf;
        for(int j = 1; j <= n; j ++)
        {
            if(dis[j]<mindis&&!vis[j])
            {
                mindis = dis[j];
                min = j;
            }
        }
        vis[min] = 1;
        for(int j = 1; j <= n; j ++)
            if(mindis+map[min][j]<dis[j]&&map[min][j]!=inf&&!vis[j])
                dis[j] = mindis + map[min][j];
    }
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i = 0; i < m; i ++)
    {
        int a,b,c;
        scanf("%d %d %d",&a,&b,&c);
        map[a][b] = c;
        map[b][a] = c;
    }
    int s,e;
    scanf("%d %d",&s,&e);
    dijkastra(s);

}

4.floyd

#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1005
#define inf 0x3f3f3f
int map[maxn][maxn],dis[maxn][maxn];
int n,m;
void init()
{
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= n; j ++)
    {
        map[i][j] = inf;
        if(i==j)
            map[i][j] = 0;
    }
}
void floyd()
{
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= n; j ++)
            dis[i][j] = map[i][j];
    for(int k = 1; k <= n; k ++)
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= n; j ++)
                if(dis[i][j]>dis[i][k]+dis[k][j])
                    dis[i][j] = dis[i][k] + dis[k][j];
}
int main()
{
    return 0;
}

5.并查集

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1005
int f[maxn],n,m;
void init()
{
    for(int i = 0; i < n; i ++)
        f[i] = i;
}
int find(int x)
{
    if(x!=f[x])
        f[x] = find(f[x]);
    return f[x];
}
void merge(int x,int y)
{
    int fa = find(x);
    int fb = find(y);
    if(fa!=fb)
        f[fa] = fb;
}
int main()
{
    init();
    scanf("%d %d",&n,&m);
    int counts = 0;
    for(int i = 0; i < m; i ++)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        if(find(a)!=find(b))
        {
            merge(a,b);
        }
    }

}

6.avl

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;

struct TreeNode
{
	int value;
	TreeNode *left;
	TreeNode *right;
	int height;
	TreeNode(int v):value(v),left(NULL),right(NULL),height(0){}
};
typedef struct TreeNode* avltree;
int getHeight(TreeNode *t)
{
	if(t == NULL) return -1;
	else return t->height;
}

//左左
TreeNode *SingleRotateLeft(TreeNode *t2)
{
	TreeNode *t1;
	t1 = t2->left;
    t2->left = t1->right;
	t1->right = t2;

	t2->height = max(getHeight(t2->left),getHeight(t2->right)) + 1;
	t1->height = max(getHeight(t1->left),getHeight(t1->right)) + 1;
	return t1;
}

//右右
 TreeNode *SingleRotateRight(TreeNode *t2)
 {
	 TreeNode *t1;
	 t1 = t2->right;
	 t2->right = t1->left;
	 t1->left = t2;

	 t2->height = max(getHeight(t2->left),getHeight(t2->right)) + 1;
	 t1->height = max(getHeight(t1->left),getHeight(t1->right)) + 1;
	 return t1;
 }

 //左右
 TreeNode * DoubleRotateLR(TreeNode *t3)
 {
	 t3->left = SingleRotateRight(t3->left);
	 return SingleRotateLeft(t3);
 }

 //右左
 TreeNode * DoubleRotateRL(TreeNode *t3)
 {
	 t3->right = SingleRotateLeft(t3->right);
	 return SingleRotateRight(t3);
 }

 TreeNode* Insert(int v, TreeNode *root)
 {

	if(root == NULL)
	{
		return new TreeNode(v);
	}
	if(v > root->value) //节点插入在右子树中
	{
		root->right = Insert(v,root->right);
		if(getHeight(root->left)-getHeight(root->right)==2||getHeight(root->left)-getHeight(root->right)==-2){
			if(v > root->right->value)
				root = SingleRotateRight(root);
			else
				root = DoubleRotateRL(root);
		}
	}else{
		root->left = Insert(v,root->left);
		if(getHeight(root->left)-getHeight(root->right)==2||getHeight(root->left)-getHeight(root->right)==-2){
			if(v < root->left->value)
				root = SingleRotateLeft(root);
			else
				root = DoubleRotateLR(root);
		}
	}
	root->height = max(getHeight(root->left),getHeight(root->right)) + 1;
	return root;
 }

 int main()
 {
	 int n;
    scanf("%d",&n);
    avltree tree = NULL;
    for(int i = 0; i < n; i ++)
    {
        int x;
        scanf("%d",&x);
        tree = Insert(x,tree);
    }
    printf("%d",tree->value);
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值