zoukankan      html  css  js  c++  java
  • 【思维】图论+贪心——NCPC 2019 Incremental Induction

    理解成图上对应关系就好想得多

    如果s[i][j]=‘0’,那么从i向j连一条边,最后形成的图必定是完全图

    当右边有t人时,右边输给左边的总场数为sum(out(i))-t*(t-1)/2,

    即右边到左边的边总数=右边的点出度和-右边点自己和自己连的边

    所以要让k最小,只要给出度排个序即可

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 5e3 + 5;
    struct node
    {
     int val, id;
    }peo[maxn];
    bool cmp(node a, node b)
    {
     return a.val < b.val;
    }
    bool arr[maxn][maxn], vis[maxn];
    int main()
    {
     long long n;
     cin >> n;
     for(int i = 1; i <= n; i++) peo[i].id = i;
     for(int i = 2; i <= n; i++)
     for(int j = 1; j < i; j++)
     {
     scanf("%1d", &arr[i][j]);
     arr[j][i] = (arr[i][j] ^ 1);
     if(arr[i][j] == 1) peo[i].val++;
     else peo[j].val++;
     }
     sort(peo + 1, peo + 1 + n, cmp);
     long long ans = 0, now = 0;
     for(int i = 1; i <= n; i++)
     {
     vis[peo[i].id] = 1;
     for(int j = 1; j <= n; j++)
     {
         if(i == j) continue;
     if(arr[peo[i].id][peo[j].id] && !vis[peo[j].id])
     now++;
     else if(arr[peo[j].id][peo[i].id] && vis[peo[j].id])
     now--;
     }
     ans = max(ans, now);
     }
     cout << ans << endl; }
  • 相关阅读:
    [CF786B] Legacy
    [CF833B] The Bakery
    [JSOI2008] 最小生成树计数
    [SDOI2010] 外星千足虫
    [POJ1830] 开关问题
    [Luogu1365] WJMZBMR打osu! / Easy
    [Noip2016] 换教室
    [NOI2002] 荒岛野人
    [计蒜之道复赛 2018] 贝壳找房计数比赛
    [SDOI2014] 旅行
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12822816.html
Copyright © 2011-2022 走看看