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;
}

浙公网安备 33010602011771号