重现赛只过了两题 ,还是太菜了…补吧。
B. Mine Sweeper II (思维题)
如果B图与A图不同的超过(n*m)/2个直接输出A的反图,反之输出A图
#include <iostream>//2020icpc上海 B 思维题
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <bitset>
using namespace std;
#define int long long
const int maxn = 1005;
char s[maxn][maxn], ss[maxn][maxn];
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n, m; cin >> n >> m;
for (int i = 0; i < n; i++) cin >> s[i];
for (int j = 0; j < n; j++) cin >> ss[j];
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (s[i][j] != ss[i][j]) ans++;
}
}
if (ans > (n * m) / 2) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (s[i][j] == '.') cout << 'X';
else cout << '.';
}
cout << endl;
}
}
else {
for (int i = 0; i < n; i++) cout << s[i] << endl;
}
return 0;
}
D. Walker(二分)
想走完整条路只有三种方式:
1.两人直接走到对面端点。
2.任意一人儿先走到离自己近的端点再走一遍全程(就是一个人走完全部的路)
3.两人面对面走相遇后返回。
代码一(二分时间):
#include <iostream>// 2020icpc 上海 D 二分时间
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <bitset>
using namespace std;
#define int long long
const double eps = 1e-7;
double n, p1, v1, p2, v2;
double ss;
bool check(double mid) {
double ss1 = v1 * mid;
double ss2 = v2 * mid;
double sss1 = max(ss1 - p1 * 2, (ss1 - p1) / 2);
double sss2 = max((ss2 - (n - p2)) / 2, (ss2 - (n - p2) * 2));
if ((sss2 + sss1) >= p2 - p1) return true;
else return false;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while (t--) {
cin >> n >> p1 >> v1 >> p2 >> v2;
if (p1 > p2) {
swap(p1, p2);
swap(v1, v2);
}
ss = 0x3f3f3f3f;
ss =min(ss, max((p2 / v2), (n - p1) / v1));
ss = min(ss, min((p1 + n) / v1, (n - p1 + n) / v1));
ss = min(ss, min((p2 + n) / v2, (n - p2 + n) / v2));
double l = max(p1 / v1, (n - p2) / v2), r = ss;//能够相遇的边界时间(划重点)
while (fabs(r - l) > eps) {
double mid = (r + l) * 1.0 / 2;
if (check(mid)) {
r = mid;
ss = min(ss, mid);
}
else l = mid;
}
printf("%.8lf\n", ss);
}
return 0;
}
代码二(二分相遇点):
#include <iostream>//icpc 上海D 二分相遇点
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <bitset>
using namespace std;
#define int long long
double n, p1, v1, p2, v2;
double ans;
const double eps = 1e-7;
double func(double pos, double len, double v) {
return min((pos + len) / v, (len - pos + len) / v);
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while (t--) {
cin >> n >> p1 >> v1 >> p2 >> v2;
if (p1 > p2) {
swap(p1, p2);
swap(v1, v2);
}
ans = 0x3f3f3f3f;
ans = min(ans, max((n - p1) / v1, p2 / v2));
ans = min(ans, min((p1 + n) / v1, (n - p1 + n) / v1));
ans = min(ans, min((p2 + n) / v2, (n - p2 + n) / v2));
double l = p1, r = p2;
while ((r - l) >= eps) {
double mid = (r + l) / 2;
double ans1, ans2;
ans1 = func(p1, mid, v1);
ans2 = func(p2 - mid, n - mid, v2);
ans = min(ans, max(ans1, ans2));
if (ans1 < ans2) l = mid;
else r = mid;
}
printf("%.8lf\n", ans);
}
return 0;
}
G. Fibonacci(推公式)
没啥说的,找规律推公式。
#include <iostream>// 2020icpc上海 G (推公式)
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <bitset>
using namespace std;
#define int long long
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n; cin >> n;
int tt = n / 3;
int ttt = tt * (tt + 1);
int tttt = ((n - 3) + (n % 3)) * tt / 2;
cout << ttt + tttt << endl;
return 0;
}
M. Gitignore(模拟)
emmm,巨恶心的一题…
#include <iostream>//2020icpc 上海 M (模拟)
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <bitset>
using namespace std;
#define int long long
const int maxn = 205;
string ss[maxn];
string s[maxn];
struct node {
string val;
int to, next;
};
node eg[maxn];
map<string, int>mmp;
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while (t--) {
int n, m; cin >> n >> m; mmp.clear();
for (int i = 1; i <= n; i++) cin >> s[i];
for (int i = 1; i <= m; i++) cin >> ss[i];
for (int i = 1; i <= m; i++) {
string x = "";
for (int j = 0; j < ss[i].size(); j++) {
x += ss[i][j];
if (ss[i][j] == '/') {
mmp[x] = 1;
}
}
}
int ans = n;
for (int i = 1; i <= n; i++) {
string x = "";
for (int j = 0; j < s[i].size(); j++) {
x += s[i][j];
if (s[i][j] == '/') {
if (mmp[x] == 0) mmp[x] = 2;
else if (mmp[x] == 1) continue;
else { ans--; break; }
}
}
}
cout << ans << endl;
}
return 0;
}