码迷,mamicode.com
首页 > 其他好文 > 详细

HDU - 6150 构造题

时间:2019-09-27 17:44:09      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:bre   std   display   src   through   names   origin   click   ref   

最近的vj好垃圾,老崩,实名吐槽

HDU - 6150 

题意:给出一个错误的求最小点覆盖的函数,需要来构造一组样例,使得那个函数跑出来的答案是正解的3倍以上。

很巧妙的构造技巧,首先想法就是弄一个二分图,让正确答案是上面的n个点,我们需要构造的就是下面的点,这就不知道为什么要这样构造了。也就是分块的思想。

从1~n每次分n/i个块,每个块的大小为i,对于每个块下面就构造出一个点跟块里所有点相连。

这样下面的点就是n+n/2+n/3+n/4+...大约就是nlnn个点,那我们要求nlnn>=3n,n>=27就可以了。

正确性上面,下面的点的度数为,1个为n的,n/(n-1)个位n-1的...n个位1的,这样每次都是优先选下面的点。

技术图片
 1 #include<cstdio>
 2 #include<vector>
 3 using namespace std;
 4 typedef pair<int,int> pii;
 5 vector<pii> vv;
 6 int main(){
 7     int u=30,v;
 8     for(int i=1;i<=30;i++){
 9         for(int j=0;j<30/i;j++){
10             u++;
11             for(int k=1;k<=i;k++){
12                 v=i*j+k;
13                 vv.push_back(pii(u,v));     
14             }
15         }
16     }
17     printf("%d %d\n",u,(int)vv.size());
18     for(int i=0;i<vv.size();i++) printf("%d %d\n",vv[i].first,vv[i].second);
19     printf("30\n");
20     for(int i=1;i<=30;i++) printf("%d\n",i);
21     return 0;
22 }
np
技术图片
 1 #include<cstdio>
 2 #include<vector>
 3 using namespace std;
 4 const int N=10000;
 5 int vis[N],deg[N];
 6 vector<int> vv[N];
 7 int f(int n){
 8     int ans=0;
 9     while(true){
10         int mx=-1,u;
11         for(int i=1;i<=n;i++){
12             if(vis[i]) continue;
13             if(deg[i]>=mx){
14                 mx=deg[i];
15                 u=i;
16             }
17         }
18         if(mx<=0) break;
19         ans++;
20         vis[u]=1;
21         for(int i=0;i<(int)vv[u].size();i++) deg[vv[u][i]]--;
22     }
23     return ans;
24 }
25 int main(){
26     int n,m,u,v;
27     while(~scanf("%d%d",&n,&m)){
28         while(m--){
29             scanf("%d%d",&u,&v);
30             vv[u].push_back(v);
31             vv[v].push_back(u);
32             deg[u]++;
33             deg[v]++;   
34         }
35         //for(int i=1;i<=30;i++) printf("%d\n",deg[i]);
36         printf("%d\n",f(n));
37     }
38     return 0;
39 }
验证代码

 

HDU - 6150 构造题

标签:bre   std   display   src   through   names   origin   click   ref   

原文地址:https://www.cnblogs.com/LMCC1108/p/11599332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!