Codeforces Round 924 (Div. 2)
Codeforces Round 924 (Div. 2)
A. Rectangle Cutting
题意:给出a*b的矩形,沿着其中一个边恰好一分为二后可以组成一个新的矩形
思路:判断其中一个边是否可以被2整除以及二分后是否等于另一个边即可
AC code:
void solve() {int a, b; cin >> a >> b;if (a % 2 == 0 && a / 2 != b || b % 2 == 0 && b / 2 != a) {cout << "YES" << endl;} else {cout << "NO" << endl;}
}
B. Equalize
题意:给出长度为n的整数数组a,将1到n的数分别加到数组元素中,数组众数最大是多少
思路:
- 去重,因为每个数一定会加上一个不同的数,原本重复的元素一定不会贡献比1更大的答案
- 排序后找到区间极值小于n的最长连续子序列,该长度就是答案(二分or双指针均可)
AC code:
- 双指针
void solve() {cin >> n;vector<int> a(n);for (int i = 0; i < n; i ++) cin >> a[i];sort(a.begin(), a.end());a.erase(unique(a.begin(), a.end()), a.end());int sz = a.size();int l = 0, r = 0, ans = 1;while (l <= r) {while (a[r] - a[l] < n && r < sz) r ++;ans = max(ans, r - l);l ++;}cout << ans << endl;
}
- 二分
bool check(const vector<int> &a, int x, int len) {for (int i = 0; i <= len - x; i ++) if (a[i + x - 1] - a[i] < n) return true;return false;
}void solve() {cin >> n;vector<int> a(n);for (int i = 0; i < n; i ++) cin >> a[i];sort(a.begin(), a.end());a.erase(unique(a.begin(), a.end()), a.end());int sz = a.size();int l = 1, r = sz;while (l < r) {int mid = l + r + 1 >> 1;if(check(a, mid, sz)) l = mid;else r = mid - 1;}cout << l << endl;
}
C. Physical Education Lesson
题意:额
-
有长度为n的一排队伍,队伍的序号有个标准值k,每2*k-2重置一次序号,每段为(1,2…k,k-1,k-2…2)这样的;
-
现在当前队尾序号为x,有多少种可能的k
思路:
-
将每组2k-2看成一段上坡一段下坡,分答案在上坡和下坡的情况
-
上坡:首先最后一段一定是1~x为结尾,而前面我们假设有Y段(2k-2),总长度为n,所以可以得到:
Y * (2 * k - 2) + x = n,即(n - x) % (2k-2) == 0 -
下坡:同理我们可以得到:
Y * (2 * k - 2) - x + 2 = n,即(n + x - 2) % (2*k-2) == 0
-
-
然后根据情况枚举因子即可,注意枚举过程可能会出现重复,所以用set来统计答案方便去重
AC code:
void solve() {cin >> n >> x;set<int> st;int fr = n - x;//上坡for (int i = 1; i <= fr / i; i ++) {if (fr % i == 0) {if (i % 2 == 0) {int k = (i + 2) / 2;if (k >= x) st.insert(k);}int j = fr / i + 2;if (j % 2 == 0) {int k = j / 2;if (k >= x) st.insert(k);}}}int ba = n + x - 2;//下坡for (int i = 1; i <= ba / i; i ++) {if (ba % i == 0) {if (i % 2 == 0) {int k = (i + 2) / 2;if (k >= x) st.insert(k);}int j = ba / i + 2;if (j % 2 == 0) {int k = j / 2;if (k >= x) st.insert(k);}}}cout << st.size() << endl;
}