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;
}