day1

测试练习

Huffuman树

​ 试题链接:http://lx.lanqiao.cn/problem.page?gpid=T69

解题思路:

构造哈夫曼树过程中,始终调取最小的两个元素,并不断地插入,第一想法是用,但是set 是一个集合,具有互异性,使用multiset保证了有序性的同时又满足了可以储存多个相同元素

需要注意:

set 或 multiset元素的访问是通过迭代器访问,类似于指针,删除元素的函数是.erase(iterator)

Iterator是一个迭代器,不能通过类似vector 访问数组的方式进行元素访问

代码:
#include<iostream>
#include<cstdio>
#include<set>

using namespace std;

int main()
{
	multiset<int> ans;
	int a;
	int n;
	int sum = 0;
	scanf("%d", &n );
	for(int i = 0; i < n; i ++)
	{
		scanf("%d", &a);
		ans.insert(a);
	}
	while(ans.size() > 1)
	{
		int fir = *ans.begin(); 
		ans.erase(ans.begin());
		int sec = *ans.begin();
		ans.erase(ans.begin());
		ans.insert(fir + sec);
		sum += fir + sec;
	}
	printf("%d", sum);
	return 0;
}

飞行员兄弟

视频:https://www.acwing.com/video/93/

题目:https://www.acwing.com/problem/content/118/

学习心得:

可以通过向量的方式进行每一步的存储,数组同样可行,用一个数a将开关的状态进行保存,每对一个开关进行操作就是对a进行异或操作,之后就是进行暴搜,每一种情况对应一个十六位的二进制数,如果能够满足要求,就与目前最优解比较,并储存最优解,最后得到的就是最优解。

核心就是位操作,路径记录,

代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>

using namespace std;

const int N = 5;

vector<pair<int, int>> step;
int num, res;
int cnt;
int change[4][4];//记录改变i, j时的值

int bit_turn(int x, int y)//将坐标转化为整数
{
    return 4 * x + y;
}

int main()
{
    string s;
    for(int i = 0; i < 4; i ++)//将开关状态用一个整数记录
    {
        cin >> s;
        for(int j = 0; j < 4; j ++)
            if(s[j] == '+')num += 1 << bit_turn(i, j);
    }
    for(int i = 0; i < 4; i ++)
        for(int j = 0; j < 4; j ++)
        {
            for(int k = 0; k < 4; k ++)
            {
                change[i][j] += 1 << bit_turn(i, k);
                change[i][j] += 1 << bit_turn(k, j);
            }
            change[i][j] -= 1 << bit_turn(i, j);
        }
    for(int i = 0; i < 1 << 16; i ++)
    {
        vector<pair<int, int>> path;
        res = num;
        for(int j = 0; j < 16; j ++)
        {
            int x = j / 4, y = j % 4;
            if(i >> j & 1)
            {
                res ^= change[x][y];
                path.push_back({x, y});
            }
        }
        if(!res && (step.empty() || step.size() > path.size()))step = path;
    }
    cout << step.size() << endl;
    for(auto c : step)
        printf("%d %d\n", c.first + 1, c.second + 1);
}

posted @ 2021-02-24 19:34  kanbujian55  阅读(81)  评论(0)    收藏  举报