文章目录
2014-2015 ACM-ICPC, Asia Tokyo Regional Contest
- A.Bit String Reordering
- B.Miscalculation
- C.Shopping
- D.Space Golf
- E.Automotive Navigation
- F.There is No Alternative
- G.Flipping Parentheses
- H.Cornering at Poles
- I.Sweet War
- J.Exhibition
- K.{infinity} Jumps
A.Bit String Reordering
题意: 给定一个01串,给定新01串形式,问新01串最少做多少次相邻字符交换才能变成01串
题解: 由于数据规模较小,直接暴力,每次匹配到不一样的,就进行向右找然后交换。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int const N = 2e5 + 10;
int n, k, a[N];
string ori, ed1, ed2;
int solve(string s1, string s2) {
int cnt0_1 = 0, cnt0_2 = 0;
for (auto s1i: s1) if (s1i == '0') cnt0_1 ++;
for (auto s2i: s2) if (s2i == '0') cnt0_2 ++;
if (cnt0_1 != cnt0_2) return N;
int len = s1.size(), res = 0;
for (int i = 0; i < len; ++i) {
if (s1[i] != s2[i]) {
char c = s1[i];
int j = i;
while(s2[j] != c && j < len) j++;
res += j - i;
s2[i] = c;
for (int k = i + 1; k <= j; ++k) s2[k] = (c ^ 1);
}
}
return res;
}
int main() {
cin >> n >> k;
ori = "", ed1 = "", ed2 = "";
for (int i = 1, t; i <= n; ++i) {
scanf("%d", &t);
ori += t + '0';
}
int num = 0;
for (int i = 1; i <= k; ++i) {
scanf("%d", &a[i]);
for (int j = 1; j <= a[i]; ++j) {
ed1 += num + '0';
ed2 += 1 - num + '0';
}
num = 1 - num;
}
// cout << ed1 << " " << ed2 << endl;
cout << min(solve(ori, ed1), solve(ori, ed2)) << endl;
return 0;
}
B.Miscalculation
题意: 给定一个字符串计算式,问按照乘法优先和从左往右计算得到的结果是否相同
题解: 分别用栈和顺序运算计算结果
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int const N = 2e5 + 10;
string s;
LL ori;
// 左右
int cal1(string s) {
LL res = 0;
for (int i = 0 ;i < s.size(); ++i) {
if (s[i] == '*') {
res *= s[i + 1] - '0';
i++;
}
else if (s[i] == '+') {
res += s[i + 1] - '0';
i++;
}
else res = s[i] - '0';
}
return res;
}
// 乘法优先
LL cal2(string s) {
stack <LL> stk;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '*') {
auto t = stk.top();
stk.pop();
stk.push(t * (s[i + 1] - '0'