1.5 vp Educational Codeforces Round 140 (Rated for Div. 2)

A - Cut the Triangle

题意:给出一个三角形的三个顶点坐标,可以竖着切可以横着切一刀,问是否能将给出的三角形切成两个三角形
思路:仅有一种情况是不能切得,那就是三角形的三条边有两条分别和x轴和y轴平行。找出这样的三角形即可。我的方法是找到一个顶点x,y坐标有一个都会跟另外一个相同

void solve() {
	int x1, y1, x2, y2, x3, y3;
	cin >> x1 >> y1;
	cin >> x2 >> y2;
	cin >> x3 >> y3;
	bool ok = 1;
	if (x1 == x2 && y1 == y3 || x1 == x3 && y1 == y2) ok = 0;
	if (x2 == x3 && y2 == y1 || x2 == x1 && y2 == y3) ok = 0;
	if (x3 == x2 && y3 == y1 || x3 == x1 && y3 == y2) ok = 0;
	if (ok) cout << "YES" <<endl;
	else cout << "NO" << endl;
}

看题解的时候看到一种解法很有意思,也放在上面

void solve() {
	set<int> se, st;
	for (int i = 1; i <= 3; i ++) {
		int x, y;
		cin >> x >> y;
		se.insert(x);
		st.insert(y);
	}
	
	if (se.size() == 2 && st.size() == 2) cout << "NO" << endl;
	else cout << "YES" << endl;
}

\[\]

B - Block Towers

题意:给出序列a,如果\(ai\) > \(aj\),即可从\(ai - 1\)\(aj + 1\)。问\(a1\)的最大可能值是多少
思路:将大于\(a1\)的所有值根据规则转移到\(a1\)上就好了嘛,但是wa了。关键在顺序上,如\(a1\) = 3,先遇到10和先遇到5最大值是不同的,先遇到大值会使较小值的贡献无法得到。因此需要将\(a1\)后面的元素进行排序后再转移到\(a1\)

void solve() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
	}
	sort(a + 2, a + 1 + n);
	
	for (int i = 2; i <= n; i ++) {
		if (a[i] > a[1]) {
			a[1] = (a[i] + a[1] + 1) / 2;
		}
	}
	
	cout << a[1] << endl;
}

\[\]

C - Count Binary Strings

C题是个难度较大的dp,赛事过题人数仅有600人,暂时无能力补

\[\]

D - Playoff

题意:有从\(1\)~\(2^n\)个人,一共进行\(n\)轮比赛。每轮参赛选手两两对决,赢得晋级下一场,最后决出胜者。
每个参赛选手都具有能力值\(pi\),但能力值不是确定的,因此\(P\)为一个\(1\)~\(2^n\)的排列。
给出有\(n\)个字符的二进制字符串\(S\)\(0\)代表本轮能力值弱的胜出,\(1\)代表本轮能力值强的胜出。
问有多少个选手在给出的字符串和能力的任意排列下最后胜出,将他们输出
思路:观察样例可知,能胜出的选手都是连续的,因此只需要找到胜出选手的最小编号和最大编号即可。
设胜出选手的编号为\(x\)\(t1\)\(S\)中字符\(1\)的个数,\(t0\)\(S\)中字符\(0\)的个数。若它能胜出,即赢得了\(n\)轮比赛。
因此一定有\(2^{t1} - 1\)个人是比\(x\)小的,且输掉比赛的人,最小值为\(2^{t1}\)。一定有\(2^{t2} - 1\)个人是比\(x\)大的,最大值为\(2^n - 2^{t2} + 1\)

void solve() {
	int n;
	cin >> n;
	string s;
	cin >> s;
	int t1 = 0, t0 = 0;
	for (auto i : s) {
		if (i == '1') t1 ++;
		else t0 ++;
	}
	
	int l = pow(2, t1), r = pow(2, n) - pow(2, t0) + 1;
	for (int i = l; i <= r; i ++) {
		cout << i << ' ';
	}
	cout << endl;
}

总结:几何题还是有些犯怵,但是事实上找到题目要求的等量关系,用代码实现即可。D题想到了连续,想到了最大值最小值,但是想不清楚怎么找到他们。思路还未打开。对于类似b题这种,有时排序找最值可能会有帮助。

posted @ 2023-01-05 16:36  nobodyL  阅读(37)  评论(0)    收藏  举报