2021算法实验机试复习内容

感觉一个太长了,本来想拆分,拆了三个,但是拆分太累了,就这么发吧

发这玩意要是能和qq空间一样省事就好了

一.复习内容

分治算法 二分查找,归并排序
回溯 01背包,八皇后
分支限界 +1*2平方,电子老鼠闯迷宫
dp贪心 最长公共子序列,最大连续子序列和,活动安排

二.源代码

1.二分查找

#include<iostream>
#include<cstdio> 
using namespace std;

const int N = 1e4 + 10;
int a[N];
int n, m;

int main()
{   
    cin >> n;
    for(int i = 0; i < n; i ++ )
        scanf("%d", &a[i]);
    cin >> m;
    while(m -- )
    {
        int k;
        scanf("%d", &k);
        int l = 0, r = n - 1;   
        while(l < r)
        {
            int mid = l + r >> 1;
            if(a[mid] >= k) r = mid;
            else l = mid + 1;
        }
        if(a[l] == k)   puts("Yes");
        else puts("No");
    }    
    return 0;
}

2.归并排序

#include<iostream>
#include<stdio.h>
using namespace std;

const int N = 1e4 + 10;
int n;
int a[N], tmp[N];

void merge_sort(int l, int r)
{
    if(l >= r)  return;
    int mid = l + r >> 1;
    merge_sort(l ,mid), merge_sort(mid + 1, r);
    int i = l, j = mid + 1, k = 0;
    while(i <= mid && j <= r)
    {
        if(a[i] <= a[j])    tmp[k ++ ] = a[i ++ ];
        else tmp[k ++ ] = a[j ++ ];
    }
    while(i <= mid)
        tmp[k ++ ] = a[i ++ ];
    while(j <= r)
        tmp[k ++ ] = a[j ++ ];
    for(int i = l, k = 0; i <= r; i ++, k ++ )
        a[i] = tmp[k];
}

int main()
{   
    cin >> n;
    for(int i = 0; i < n; i ++ )
        scanf("%d", &a[i]);
    merge_sort(0, n - 1);
    for(int i = 0; i < n; i ++ )
        cout << a[i] << endl;
    return 0;
}

3.01背包

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;

const int N = 15;
int p[N], w[N], f[N];

int main()
{
	int n, c;
    while(scanf("%d%d", &n, &c), n || c)
    {
		memset(f, 0, sizeof f);
        for(int i = 1; i <= n; i ++ )
            scanf("%d", &w[i]);
        for(int i = 1; i <= n; i ++ )
            scanf("%d", &p[i]);
        for(int i = 1; i <= n; i ++ )
            for(int j = c; j >= w[i]; j -- )
                f[j] = max(f[j], f[j - w[i]] + p[i]);
        cout << f[c] << endl;
    }
    return 0;
}

4.八皇后

#include<iostream>
#include<cstdio>
using namespace std;

const int N = 10, M = 2 * N;
bool col[N], dg[M], udg[M];
char g[N][N];
int cnt;

void dfs(int u)
{
	if(u >= 8)
	{
		cnt ++;
		cout << "No " << cnt << ":"<< endl;
		for(int i = 0; i < 8; i ++ )
			puts(g[i]);
		return;
	}
	for(int i = 0; i < 8; i ++ )
		if(!col[i] && !dg[u + i] && !udg[8 - i + u])
		{
			col[i] = dg[u + i] = udg[8 - i + u] = 1;
			g[u][i] = 'A';
			dfs(u + 1);
			g[u][i] = '.';
			col[i] = dg[u + i] = udg[8 - i + u] = 0;
		}
}

int main()
{
	for(int i = 0; i < 8; i ++ )
		for(int j = 0; j < 8; j ++ )
			g[i][j] = '.';
	dfs(0);
	return 0;
}

5.加一乘二平方

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;

const int N = 10010;
int step[N];
int m, n;

void bfs()
{
    memset(step, -1, sizeof step);
    step[m] = 0;
    queue<int> q;
    q.push(m);

    while(q.size())
    {
        if(step[n] != -1)   return;

        int t = q.front();
        q.pop();

        if(t + 1 <= n && step[t + 1] == -1)
        {
            q.push(t + 1);
            step[t + 1] = step[t] + 1;
        }    
        if(t * 2 <= n && step[t * 2] == -1)
        {
            q.push(t * 2);
            step[t * 2] = step[t] + 1;
        }    
        if(t * t <= n && step[t * t] == -1)
        {
            q.push(t * t);
            step[t * t] = step[t] + 1;
        }   
    }
}

int main()
{
    cin >> m >> n;
    bfs();
    cout << step[n] << endl;
    return 0;
}

6.电子老鼠闯迷宫

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;

struct state {int x, y;};
const int N = 15, INF = 1e9;
int d[N][N]; 
state in, out;

void bfs()
{
    queue<state> q;
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
    q.push(in);
    d[in.x][in.y] = 0;

    while(q.size())
    {
        if(d[out.x][out.y] != -1)  
            return;

        state t = q.front();
        q.pop();
        
        for(int i = 0; i < 4; i ++ )
        {
            int x = t.x + dx[i], y = t.y + dy[i];
            if(x > 0 && x <= 12 && y > 0 && y <= 12 && d[x][y] == -1)
            {
                d[x][y] = d[t.x][t.y] + 1;
                state tmp;
                tmp.x = x, tmp.y = y;
                q.push(tmp);
            }
        }
    }
}

int main()
{
    cin >> in.x >> in.y >> out.x >> out.y;
    memset(d, -1, sizeof d);
    for(int i = 1; i <= 12; i ++ )
        for(int j = 1; j <= 12; j ++ )
        {
        	char c;
        	cin >> c;
        	if(c == 'X')	d[i][j] = -INF;
		}
    bfs();
    cout << d[out.x][out.y] << endl;
    return 0;
}

7.最长公共子序列

(2条消息) 西工大算法设计与分析 1041最长公共子序列(实验四)_m0_56192195的博客-CSDN博客

8.最大连续子序列和

(2条消息) 西工大算法设计与分析 noj1576 最大连续子序列和问题(实验四)_m0_56192195的博客-CSDN博客

9.活动安排

(2条消息) 西工大算法设计与分析 noj1205 活动安排(实验四)_m0_56192195的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值