• CodeForces 731C Socks


    http://codeforces.com/problemset/problem/731/C

    并查集+贪心 将要求颜色相同的袜子序号放入一个集合中

    贪心:然后统计这个集合中出现次数最多但颜色 可以得到这个集合要repain的次数

    代码有难度

    统计集合数

    int tot;//总的集合数

    for (int i = 1; i <= n; i++)

      if(par[i] == i)

    {

      rec[tot++] = i;//记录根节点

    //统计每个集合红颜色的个数

    map<int, int> clmp;

    vector<int> G[MAXN];

    for(int i = 1; i <= n; i++)

    {

      G[par[i]].push_back(color[i]);

    }

    int ans = 0;

    for(int i = 0; i < tot; i++)//统计颜色情况

    {

      clmp.clear();

      for (int j = 0; j < v[rec[i]].size(); j++)

      clmp[v[rec[i]][j]]++;

    }

     1 #include <bits/stdc++.h>
     2 #define MAXN 200007
     3 using namespace std;
     4 
     5 int par[MAXN];
     6 
     7 int find(int x)
     8 {
     9     if (par[x] == x) return x;
    10     else return par[x] = find(par[x]);
    11 }
    12 bool same(int x, int y)
    13 {
    14     int px, py;
    15     px = find(x);
    16     py = find(y);
    17     return px == py;
    18 }
    19 void unite(int x, int y)
    20 {
    21     int px = find(x);
    22     int py = find(y);
    23     par[px] = py;
    24 }
    25 int color[MAXN];
    26 int rec[MAXN];
    27 vector<int> v[MAXN];
    28 map<int,int> clmap;
    29 int main()
    30 {
    31     int day, paint, socks, ans = 0;
    32     scanf("%d%d%d", &socks, &day, &paint);
    33     for (int i =  0;  i <= socks; i++) par[i] = i;
    34     for (int i = 1; i <= socks; i++)
    35     {
    36         scanf("%d", &color[i]);
    37     }
    38     for (int i = 0; i < day; i++)
    39     {
    40         int l, r;
    41         scanf("%d%d", &l, &r);
    42         unite(l, r);
    43     }
    44     int tot = 0;
    45     for (int i = 1; i <= socks; i++)
    46     {
    47         if (i == find(i))
    48         {
    49             rec[tot++] = i;
    50         }
    51     }
    52     for (int i = 1; i <= socks; i++)
    53     {
    54         v[par[i]].push_back(color[i]);
    55     }
    56     for (int i = 0; i < tot; i++)
    57     {
    58         clmap.clear();
    59         for(int j = 0; j < v[rec[i]].size(); j++)
    60         {
    61             clmap[v[rec[i]][j]]++;
    62         }
    63         map<int,int> :: iterator it;
    64         int maxn = 0;
    65         for (it = clmap.begin(); it != clmap.end(); it++)
    66         {
    67             maxn = max(maxn, (*it).second);
    68         }
    69         ans += v[rec[i]].size() - maxn;
    70     }
    71     cout << ans << endl;
    72 }
  • 相关阅读:
    Linux 文件管理篇(一 档案读写)
    Linux 任务管理篇(一)
    Mysql 视图简介
    MySql 使用正则表达式查询
    mysql 插入、更新与删除数据
    mysql 多表查询
    mysql 单表查询
    Java抽象类与接口
    maven小结
    shiro 进行权限管理 —— 使用BigInteger进行权限计算获取菜单
  • 原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6746150.html
Copyright © 2020-2023  润新知