day1
测试练习
Huffuman树
试题链接:http://lx.lanqiao.cn/problem.page?gpid=T69
解题思路:
构造哈夫曼树过程中,始终调取最小的两个元素,并不断地插入,第一想法是用
需要注意:
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);
}

浙公网安备 33010602011771号