codeforces #588 ABCD

心不动则不痛 提交于 2019-12-03 08:13:14

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 }
View Code

 

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 }
View Code

 

E

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!