2020icpc(上海) 重现赛

重现赛只过了两题 ,还是太菜了…补吧。
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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值