JZOJ 4226. 【五校联考3day2】A
题目
大意
就是说有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 }
为何要逼自己长大,去闯不该闯的荒唐