总结与练习

116. 飞行员兄弟

在这里插入图片描述
在这里插入图片描述

这道题要用一个16位的二进制数来进行枚举,每一位用来表示相应位置的开关是否要进行操作
按照相应的数字来进行对开关进行操作,最后需要判断开关是否全部关闭
每次操作完之后,要将矩阵恢复成最初的状态

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

char m[5][5], t[5][5];

void turn(int x, int y)
{
	for (int i = 0; i < 4; i++)
		m[i][y] = m[i][y] == '+' ? '-' : '+';
	for (int j = 0; j < 4; j++)
		m[x][j] = m[x][j] == '+' ? '-' : '+';
	m[x][y] = m[x][y] == '+' ? '-' : '+';
}

int main(void)
{
	int cnt;
	for (int i = 0; i < 4; i++)
		cin >> m[i];
	memcpy(t, m, sizeof m);
	for (int i = 0; i < 1 << 16; i++){
		cnt = 0;
		for (int j = 0; j < 16; j++){//用来判断相应位置的开关是否进行操作 
			int x = j / 4;
			int y = j % 4;
			if ((i >> j) & 1){
				cnt++;
				turn(x, y);
			}
		}
		bool flag = true;
		for (int j = 0; j < 4; j++){
			for (int h = 0; h < 4; h++){
				if (m[j][h] == '+'){
					flag = false;
				}
			}
		}
		memcpy(m, t, sizeof t);//恢复
		if (flag){
			cout << cnt << endl;
			for (int j = 0; j < 16; j++){//判断是否进行操作 
				int x = j / 4 + 1;
				int y = j % 4 + 1;
				if ((i >> j) & 1){
					cout << x << " " << y << endl;
				}
			}
		}
	}
	return 0;
}

118. 分形

在这里插入图片描述
在这里插入图片描述
输入样例:

1
2
3
4
-1

输出样例

X
-
X X
 X
X X
-
X X   X X
 X     X
X X   X X
   X X
    X
   X X
X X   X X
 X     X
X X   X X
-
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
         X X   X X
          X     X
         X X   X X
            X X
             X
            X X
         X X   X X
          X     X
         X X   X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
   X X               X X
    X                 X
   X X               X X
X X   X X         X X   X X
 X     X           X     X
X X   X X         X X   X X
-
#include <iostream>
using namespace std;
const int N = 1005;

char g[N][N];

void dfs(int n)
{
	if (n == 1){
		g[0][0] = 'X';
		return;
	}
	
	dfs(n - 1);
	
	int len = 1;
	for (int i = 0; i < n - 2; i++)
		len *= 3;
	int sx[4] = {0, 1, 2, 2}, sy[4] = {2, 1, 0, 2};
	for (int k = 0; k < 4; k++)
		for (int i = 0; i < len; i++)
			for (int j = 0; j < len; j++)
				g[sx[k] * len + i][sy[k] * len + j] = g[i][j];
}

int main(void)
{
	dfs(7);
	
	int n;
	while (cin >> n && n != -1){
		int len = 1;
		for (int i = 0; i < n - 1; i++)
			len *= 3;
		for (int i = 0; i < len; i++){
			for (int j = 0; j < len; j++)
				if (g[i][j]) cout << 'X';
				else cout << ' ';
			cout << endl;
		}
		cout << '-' << endl;
	}
	return 0;
}

122. 糖果传递

在这里插入图片描述

这道题需要注意数据范围

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 5;
typedef long long ll;

int a[N];
ll sum[N], c[N];

int main(void)
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++){
		cin >> a[i];
		sum[i] = sum[i - 1] + a[i];
	}
	ll ave = sum[n] / n;
	for (int i = 1; i <= n; i++){
		c[i] = sum[i] - (i - 1) * ave;
	}
	sort(c + 1, c + n + 1);
	int mid = c[(n + 1) / 2];
	ll ans = 0;
	for (int i = 1; i <= n; i++){
		ans += abs(c[i] - mid);
	}
	cout << ans << endl;
	return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 5;
typedef long long ll;

int a[N];
ll c[N];

int main(void)
{
	int n;
	ll ave = 0;
	cin >> n;
	for (int i = 1; i <= n; i++){
		cin >> a[i];
		ave += a[i];
	}
	ave /= n;
	c[1] = a[1];
	for (int i = 2; i <= n; i++){
		c[i] = c[i - 1] + a[i] - ave;
	}
	sort(c + 1, c + n + 1);
	ll mid = c[(n + 1) / 2];
	ll ans = 0;
	for (int i = 1; i <= n; i++){
		ans += abs(c[i] - mid);
	}
	cout << ans << endl;
	return 0;
}

126. 最大的和

在这里插入图片描述
在这里插入图片描述

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

int m[105][105];

int main(void)
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			cin >> m[i][j];
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			m[i][j] += m[i - 1][j] + m[i][j - 1] - m[i - 1][j - 1]; 
	int ans = 0xcfcfcfcf;
	for (int x = 1; x <= n; x++)
		for (int y = 1; y <= n; y++)
			for (int i = x; i <= n; i++)
				for (int j = y; j <= n; j++)
					ans = max(ans, m[i][j] - m[i - x][j] - m[i][j - y] + m[i - x][j - y]);
	cout << ans << endl;
	return 0;
}
发布了171 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43772166/article/details/104035036
今日推荐