A
假设1的个数是偶数个(设为x),那么1的个数不可能超过x个。
假设1的个数是奇数个(设为x),那么1的个数可以变为x+1个。
当然,想要1的数目变少只要不断地pop就可以了。
显然,0可以在中间随便插,所以最后只要判1的个数。
B
当且仅当我们可以找到这样一组匹配的时候,A没法超过B:
对于每个$$0 \leq i \lt n$$有$$a[i] \leq b[match[i]]$$
证明:
1、显然有此匹配时,$$\sum a_i \leq \sum b_i$$。
2、当没有这种匹配时,对于没有被匹配到的a[i],重量取个超级大的数,然后后面的重量都一样,那么A就可以超过B了。
所以只要a, b sort一下作一下判断就可以了。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <set> #include <map> #include <bitset> #include <queue> #include <stack> #include <vector> using namespace std; typedef long long ll; #define foreach(it, v) for (__typeof((v).end()) it = (v).begin(); it != (v).end(); it++) #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define forn(i, a, b) for (int i = (int)(a); i <= (int)(b); i++) #define clr(a, x) memset(a, x, sizeof(a)) #define all(v) (v).begin(), (v).end() const int N = 100005; int m, n, k; int a[N], b[N]; int main() { scanf("%d%d%d", &m, &n, &k); rep (i, m) scanf("%d", &a[i]); rep (i, n) scanf("%d", &b[i]); sort(a, a + m); sort(b, b + n); int j = 0; bool flag = 0; rep (i, m) { while (j < n && b[j] < a[i]) j++; if (j == n) { flag = 1; break; } j++; } puts(flag ? "YES" : "NO"); }
C
构造题不懂……其实就是太弱,一直以为6 0 1 2 3 4 5这组数据是无解的,导致后面想歪了。
看了rng_58的代码茅塞顿开。
其实根本没有无解的情况
按s sort一下,然后令m = (n + 2) / 3。
第一部分(0 <= i < m):a[i] = 0, b[i] = s[i]
第二部分(m <= i < m + m):a[i] = s[i], b[i] = 0
第三部分(m + m <= i < n):a[i] = n - i - 1, b[i] = s[i] - a[i]
第一部分的用意是把a的[1,m-1]这个区间内的值空出来
第二部分的用意是把b里[s[m - 1] + 1, +oo)这个区间的值空出来
第三部分a就把第一部分的坑填了,b则保证了大于s[m - 1],并且b值严格递增。
不得不服。
D
先保证m<=n,然后让横的限制全满足,竖的限制满足超过一半即可。只需要0,1就够了。
E
坑