JZOJ 4226. 【五校联考3day2】A

题目

Description

帝国时代3是一款十分刺激的RTS游戏。你需要控制自己的一块殖民地,发展殖民地的经济和军事,最终打败其他殖民地。小L是这个游戏的狂热爱好者。一次小L打算打AI试试身手。
小L发展了几分钟,自己的殖民地人口便突破了30,然而小L发现大事不好了:
小L还处在不能建造军事单位的“发现时代”,然而敌人早已经到了“殖民时代”,发展起了一支雄厚的殖民地军,小L的殖民地受攻击了却没有一个正规的军事单位用来防御!不要认为这是小L 的技术问题,实际上AI还停留在以jg斗争为纲的落后理念上,而小L 早就以经济为第一要务了。
小L在之前已经在自己殖民地的外部,拉起了许多围墙。
帝国时代3里的围墙如图所示。

每一道围墙,总是连接着两个围墙连接处(以下简称“连接处”)。

现在小L有n个连接处,m道围墙}。
小L虽然没兵,但是他的智商比AI不知道高到那里去了,因此,只要每个连接处至少连接着k道围墙},小L就一定能顶住这波攻击。
小L可以任意加围墙,每道围墙可以连接两个已有的连接处。
连接处是不能连接自己的,但是这里有一些规则与原帝国时代3的设定不同,两个连接处之间可以连接多个围墙,连接处初始时可能不连任何围墙,围墙之间也可以相交。
小L想知道,自己至少要多加多少道围墙}才能满足每个连接处至少连接着k道围墙?
 

Input

第一行三个整数n, m, k,表示连接处个数、围墙个数以及每个连接处至少要连接的围墙个数,连接处被编号为1到n}。
接下来m行,每行两个正整数x, y,表示这个围墙连接编号为x的连接处和编号为y的连接处。

Output

输出一行一个整数,表示至少要加的围墙的条数。
 

Sample Input

输入1:
2 0 1
输入2:
5 4 2
1 2
2 5
4 3
3 1
输入3:
4 3 2
1 2
2 3
1 2
输入4:
5 11 7
1 3
4 2
1 5
4 2
2 5
1 3
4 1
2 3
4 1
5 1
1 5

Sample Output

输出1:
1
样例1解释:初始时有两个连接处,题目中要求至少每个连接处要连1个围墙,我们加一个围墙连接这两个连接处即可。
输出2:
1
样例2解释:连接编号为5的和编号为4的连接处即可。
输出3:
2
样例3解释:编号为4的连接处没有连接任何围墙,编号为3的连接处还需要一条。连接编号为4的和编号为3的连接处之后,编号为4的连接处与另外三个连接处中任意一个连一个围墙即可,注意连接处是不能自己和自己连接的。
输出4:
7
 

Data Constraint

对于60%的数据,n × ans ≤ 10000000,ans表示最终的答案。
对于前100%的数据,n, m, k ≤ 100000,n ≥ 2, m, k ≥ 0, x ≠ y, 1 ≤ x, y ≤ n。

大意

     就是说有n个点,每个点至少要出度为k

     问要添加多少边

分析

  • 可以用优先队列,每次弹出差最多的两个点进行连边     90      超时

  • 好吧正解居然是道结论题
  • 感性理解下吧
  • 直 接 统 计 出 每 个 点 还 需 要 多 少 个 度 数 , 如 果 需 要 的 度 数 最 多 的 点 大 于
    其 他 点 需 要 的 度 数 总 和 答 案 就 是 这 个 点 的 度 数a否 則 就 是 所 有 点 需 要 的 度
    数 的 总 和 除 以 二 向 上 馭 整 。
    复 杂 度 並 然 是 读 入 复 杂 度 。
    从 没 有 多 组 数 据 上 就 可 以 看 出 我 为 了 给 大 家 送 分 做 出 的 努 力 , 下 面 我
    们 来 欣 赏 一 下 数 据 :
    少 考 虑 一 种 情 : 兄 5 0 分 。
    暴 力 7 0 分 。
    向 下 馭 整 90 分 。
    没 开long long 9 0 分 。
    这 样 的 出 題 人 世 界 上 哪 里 找 哦 。

图片转文字。。。。

 

代码

 1 #include<iostream>
 2 using namespace std;
 3 int a[1000001],b[1000001],flag[1000001];
 4 int main ()
 5 {
 6     int n,m,k;
 7     cin>>n>>m>>k;
 8     for (int i=1,x,y;i<=m;i++)
 9     {
10         cin>>x>>y;
11         a[x]++;
12         a[y]++;
13     }
14     int h=0,cs=0;
15     for (int i=1;i<=n;i++)
16         if (a[i]<k)
17             b[++cs]=i;
18      int ans=0;
19       while(1)
20       {
21           int minn=1e9,wz=0;
22         for (int i=1;i<=cs;i++)
23           if (minn>a[b[i]]&&!flag[b[i]])
24           {
25                 minn=a[b[i]];
26                 wz=b[i];
27           }
28           if (wz==0)
29              break;
30          flag[wz]=1;
31          int kk=k-minn;
32           for (int i=1;i<=cs&&kk>0;i++)
33         {
34             if (!flag[b[i]])
35             {
36                 ans++;
37                 a[b[i]]++;
38                 a[wz]++;
39                 kk--;
40                 if (a[b[i]]==k)
41                    flag[b[i]]=1;
42             }
43         }
44         if (kk>0)
45            ans+=kk;
46       }
47       cout<<ans;
48 }

 

 

posted @ 2019-01-28 21:47  Melted_czj  阅读(150)  评论(0编辑  收藏  举报
body { background-color:whitesmoke; } // 修改背景颜色为半透明 #home,#sideBarMain>div,#blog-sidecolumn>div>div,.catListView{ background-color:rgba(255,255,255,0); } // 修改其他边框的颜色