A. Dawid and Bags of Candies
Description
给出4个数,判断能否分成权值相等的两部分。
Solution
排序判断$a[0]+a[3]==a[1]+a[2]||a[0]+a[1]+a[2]==a[3]$
B. Ania and Minimizing
Description
Solution
贪心+模拟。
C. Anadi and Domino
Description
给出21张骨牌如上,以及一个无向简单图。
骨牌可以放在边上,使得起点和终点对应骨牌的两侧。
要求每个点对应的骨牌点数一致,问最多能放多少骨牌。
Solution
n的值较小,可以直接搜索。
最后计算这样染色的贡献,取个最大值。
1 #include <algorithm> 2 #include <numeric> 3 #include <cctype> 4 #include <cmath> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <cstring> 8 #include <iostream> 9 #include <map> 10 #include <queue> 11 #include <set> 12 #include <stack> 13 #if __cplusplus >= 201103L 14 #include <unordered_map> 15 #include <unordered_set> 16 #endif 17 #include <vector> 18 #define lson rt << 1, l, mid 19 #define rson rt << 1 | 1, mid + 1, r 20 #define LONG_LONG_MAX 9223372036854775807LL 21 #define pblank putchar(' ') 22 #define ll LL 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) 24 using namespace std; 25 typedef long long ll; 26 typedef long double ld; 27 typedef unsigned long long ull; 28 typedef pair<int, int> P; 29 int n, m, k; 30 const int maxn = 1e5 + 10; 31 template <class T> 32 inline T read() 33 { 34 int f = 1; 35 T ret = 0; 36 char ch = getchar(); 37 while (!isdigit(ch)) 38 { 39 if (ch == '-') 40 f = -1; 41 ch = getchar(); 42 } 43 while (isdigit(ch)) 44 { 45 ret = (ret << 1) + (ret << 3) + ch - '0'; 46 ch = getchar(); 47 } 48 ret *= f; 49 return ret; 50 } 51 template <class T> 52 inline void write(T n) 53 { 54 if (n < 0) 55 { 56 putchar('-'); 57 n = -n; 58 } 59 if (n >= 10) 60 { 61 write(n / 10); 62 } 63 putchar(n % 10 + '0'); 64 } 65 template <class T> 66 inline void writeln(const T &n) 67 { 68 write(n); 69 puts(""); 70 } 71 template <typename T> 72 void _write(const T &t) 73 { 74 write(t); 75 } 76 template <typename T, typename... Args> 77 void _write(const T &t, Args... args) 78 { 79 write(t), pblank; 80 _write(args...); 81 } 82 template <typename T, typename... Args> 83 inline void write_line(const T &t, const Args &... data) 84 { 85 _write(t, data...); 86 } 87 int x[50], y[50]; 88 int col[8], vis[8][8]; 89 int ans; 90 void dfs(int now){ 91 if (now>n){ 92 int cur = 0; 93 memset(vis ,0, sizeof vis); 94 for (int i = 0; i < m;i++){ 95 int ta = col[x[i]], tb = col[y[i]]; 96 if (!vis[ta][tb]) 97 ++cur, vis[ta][tb] = vis[tb][ta] = 1; 98 } 99 ans = max(cur, ans); 100 return; 101 } 102 for (int i = 1; i <= 6;i++) 103 col[now] = i, dfs(now + 1); 104 } 105 int main(int argc, char const *argv[]) 106 { 107 #ifndef ONLINE_JUDGE 108 freopen("in.txt","r", stdin); 109 // freopen("out.txt","w", stdout); 110 #endif 111 n = read<int>(), m = read<int>(); 112 for (int i = 0; i < m;i++) 113 x[i] = read<int>(), y[i] = read<int>(); 114 dfs(1); 115 writeln(ans); 116 return 0; 117 }
D. Marcin and Training Camp
Description
给出n个人的技能点$a[i]$,技能权重$b[i]$.
如果x有的技能y没有,x会看不起y,同样y会的x不会y也会看不起x。
两个人可以互相看不上。
要求分出一个小组,该小组满足组内没有一个人看不上其他所有人且技能权重最大。
Solution
如果两个人的技能点完全一致,那么显然这两个人不会互相看不上对方,就满足了不会看不上全部人的条件。
那么我们可以将技能点一致的那些人直接加入优先答案集合,注意优先答案集合和下文答案集合不一样。
然后枚举在优先答案集合之外的其他人x,如果x的技能点是优先答案集合内某个人的技能点子集,那么显然x加入不会看不上其他所有人,加入答案集合计入贡献。
1 #include <algorithm> 2 #include <cctype> 3 #include <cmath> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cstring> 7 #include <iostream> 8 #include <map> 9 #include <numeric> 10 #include <queue> 11 #include <set> 12 #include <stack> 13 #if __cplusplus >= 201103L 14 #include <unordered_map> 15 #include <unordered_set> 16 #endif 17 #include <vector> 18 #define lson rt << 1, l, mid 19 #define rson rt << 1 | 1, mid + 1, r 20 #define LONG_LONG_MAX 9223372036854775807LL 21 #define pblank putchar(' ') 22 #define ll LL 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) 24 using namespace std; 25 typedef long long ll; 26 typedef long double ld; 27 typedef unsigned long long ull; 28 typedef pair<int, int> P; 29 int n, m, k; 30 const int maxn = 1e4 + 10; 31 template <class T> 32 inline T read() 33 { 34 int f = 1; 35 T ret = 0; 36 char ch = getchar(); 37 while (!isdigit(ch)) 38 { 39 if (ch == '-') 40 f = -1; 41 ch = getchar(); 42 } 43 while (isdigit(ch)) 44 { 45 ret = (ret << 1) + (ret << 3) + ch - '0'; 46 ch = getchar(); 47 } 48 ret *= f; 49 return ret; 50 } 51 template <class T> 52 inline void write(T n) 53 { 54 if (n < 0) 55 { 56 putchar('-'); 57 n = -n; 58 } 59 if (n >= 10) 60 { 61 write(n / 10); 62 } 63 putchar(n % 10 + '0'); 64 } 65 template <class T> 66 inline void writeln(const T &n) 67 { 68 write(n); 69 puts(""); 70 } 71 template <typename T> 72 void _write(const T &t) 73 { 74 write(t); 75 } 76 template <typename T, typename... Args> 77 void _write(const T &t, Args... args) 78 { 79 write(t), pblank; 80 _write(args...); 81 } 82 template <typename T, typename... Args> 83 inline void write_line(const T &t, const Args &... data) 84 { 85 _write(t, data...); 86 } 87 inline int f(ll x, ll y) 88 { 89 while (x && y) 90 { 91 int t1 = x % 2, t2 = y % 2; 92 if (t1 && !t2) 93 return 1; 94 x >>= 1, y >>= 1; 95 } 96 if (x && !y) 97 return 1; 98 return 0; 99 } 100 vector<ll> vec; 101 ll a[maxn], b[maxn]; 102 unordered_map<ll, int> vis1, vis2; 103 unordered_map<ll, int> mp; 104 int main(int argc, char const *argv[]) 105 { 106 #ifndef ONLINE_JUDGE 107 freopen("in.txt", "r", stdin); 108 // freopen("out.txt","w", stdout); 109 #endif 110 111 n = read<int>(); 112 for (int i = 1; i <= n; i++) 113 { 114 a[i] = read<ll>(); 115 mp[a[i]]++; 116 if (mp[a[i]] >= 2 && !vis1[a[i]]) 117 vis1[a[i]] = 1, vec.emplace_back(a[i]); 118 } 119 for (int i = 1; i <= n; i++) 120 b[i] = read<ll>(); 121 ll ans = 0; 122 int sz = vec.size(); 123 for (int i = 0; i < sz; i++) 124 { 125 ll t = vec[i]; 126 for (int j = 1; j <= n; j++) 127 if (!vis2[j] && (t | a[j]) == t) 128 ans += b[j], vis2[j] = 1; 129 } 130 writeln(ans); 131 return 0; 132 }
E