A - Rotate
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int main()
{
string s;
cin >> s;
cout << s[1] << s[2] << s[0];
return 0;
}
B - Visibility
上下左右四个循环跑一遍。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
char maze[120][120];
int main()
{
int h, w, x, y;
cin >> h >> w >> x >> y;
for (int i = 1; i <= h; i++)
for (int j = 1; j <= w; j++)
cin >> maze[i][j];
int ans = 0;
for (int i = x + 1; i <= h; i++)
{
if (maze[i][y] == '#')
break;
ans++;
//cout << ans << endl;
}
for (int i = x - 1; i >= 1; i--)
{
if (maze[i][y] == '#')
break;
ans++;
}
for (int i = y + 1; i <= w; i++)
{
if (maze[x][i] == '#')
break;
//cout << x << " " << i << endl;
ans++;
//cout << ans << endl;
}
for (int i = y - 1; i >= 1; i--)
{
if (maze[x][i] == '#')
break;
ans++;
//cout << ans << endl;
}
cout << ans + 1 << endl;
// system("pause");
}
C - ORXOR
给定一个长度为n的序列,将序列分成若干个区间,将各个区间内的元素或运算后得到的结果进行异或运算, 求最终结果的最小值
对于长度为n的序列,一共进行n-1次操作,枚举所有可能的操作序列 ,比较得到最小值。
枚举操作序列
用二进制法枚举所有可能的序列,设1为 xor 操作,0为 or 操作
对于一个长度为n的二进制序列,其最大值为1<<n;
枚举从0-1<<n 的所有值,将每个值对应的二进制数序列作为可能的操作序列。
int solve(int x)
{
memset(a, 0, sizeof(a));
for (int i = 0; i < n; i++)
if (x & (1 << i))
a[i + 1] = 1;
return query(a);
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> q[i];
int minx =0x7fffffff;
for (int i = 0; i < (1 << n); i++)
{
minx = min(solve(i), minx);
}
cout << minx;
system("pause");
}
对每个操作序列求值
栈。
int query(int a[])
{
stack<int> sk;
sk.push(q[0]);
for (int i = 1; i < n; i++)
{
if (a[i] == 0)
{
int tmp = sk.top();
sk.pop();
sk.push(tmp | q[i]);
}
else
sk.push(q[i]);
}
int ans = sk.top();
sk.pop();
while (!sk.empty())
{
int tmp = sk.top();
sk.pop();
ans = ans ^ tmp;
}
return ans;
}