Codeforces Round #786 (Div. 3) A—D
Codeforces Round #786 (Div. 3)
https://codeforces.com/contest/1674
A Number Transformation
直接贪,一个取1,另一个取y / x
#include <bits/stdc++.h>
using namespace std;
int main () {
int t;
cin >> t;
while (t --) {
int x, y;
cin >> x >> y;
if (x > y || (y % x)) {
cout << 0 << ' ' << 0 << endl;
continue;
}
if (x == y) {
cout << 1 << ' ' << 1 << endl;
continue;
}
cout << 1 << ' ' << y / x << endl;
}
}
B Dictionary
直接去看字母顺序,注意的是中间类似"bb","cc"...等两串相同的会直接跳过,所以碰到的时候idx要记得-1
(我真是太暴力了)
#include <bits/stdc++.h>
using namespace std;
int main () {
int t;
cin >> t;
while (t --) {
string s;
cin >> s;
int ans = (s[0] - 'a') * 26 + (s[1] - 'a') ;
if (s > "bb")
ans --;
if (s > "cc")
ans --;
if (s > "dd")
ans --;
if (s > "ee")
ans --;
if (s > "ff")
ans --;
if (s > "gg")
ans --;
if (s > "hh")
ans --;
if (s > "ii")
ans --;
if (s > "jj")
ans --;
if (s > "kk")
ans --;
if (s > "ll")
ans --;
if (s > "mm")
ans --;
if (s > "nn")
ans --;
if (s > "oo")
ans --;
if (s > "pp")
ans --;
if (s > "qq")
ans --;
if (s > "rr")
ans --;
if (s > "ss")
ans --;
if (s > "tt")
ans --;
if (s > "uu")
ans --;
if (s > "vv")
ans --;
if (s > "ww")
ans --;
if (s > "xx")
ans --;
if (s > "yy")
ans --;
cout << ans << endl;
}
}
C Infinite Replacement
- 无穷种可能:t有a且非全a ,就可以一直替换,无限套娃
- 一种可能:t=="a",放在哪里都一样
- 其余:\(2^{s.size()}\) (可根据集合的性质得出)
#include <bits/stdc++.h>
using namespace std;
int main () {
int _;
cin >> _;
while (_ --) {
string s, t;
cin >> s >> t;
if (t == "a") {
cout << 1 << endl;
continue;
}
int cnta = 0;
for (int i = 0; i < t.size(); i ++)
if (t[i] == 'a') {
cnta ++;
break;
}
//t有a且非全a 无穷
if (cnta) {
cout << -1 << endl;
continue;
}
//cout << (long long)pow(2, s.size()) << endl;
cout << (1LL << s.size()) << endl;
}
}
//
D A-B-C Sort
如图,把交换的过程具象化,之后可以发现:
- 以两个块为整体来看,本质是一个换过去又换回来的过程,所以只需要考虑内部的变化,即当n−i为偶数的时候,可以交换ai和ai+1
- 当出现一个落单的块(即长度为奇数)时,它最终是无法改变自身位置的,所以就直接不管他了
最后直接check一下是否有序就ok啦~
(感谢szr大佬的图)
#include <bits/stdc++.h>
using namespace std;
bool solve () {
int n;
cin >> n;
vector <int> v(n);
for (int i = 0; i < n; i ++)
cin >> v[i];
if (n <= 2) //长度为2的时候一定可以实现
return true;
for (int i = n - 2; i >= 0; i -= 2)
if (v[i] > v[i + 1])
swap (v[i], v[i + 1]);
if (is_sorted (v.begin(), v.end ()))
return true;
return false;
}
int main () {
int t;
cin >> t;
while (t --) {
if (solve ())
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}
//当n−i为偶数的时候,可以交换ai和ai+1。
后面的题如果搞懂了就补补