HDU - 6150 构造题

最近的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 }

验证代码

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

时间: 2024-10-15 13:05:49

HDU - 6150 构造题的相关文章

HDU 5402 (构造题) Travelling Salesman Problem

题意 略. 思路 比赛的时候其实已经意识到是一个构造题了. 蓝儿m,n都是偶数的时候搞崩了.sad.. m,n有一个是奇数不说了,可以走完所有. 两个都是偶数的时候,我们就去找一个最小的值且它的位置坐标和是奇数,然后就绕开这个走.其他都可以走完辣. 参考code: /* #pragma warning (disable: 4786) #pragma comment (linker, "/STACK:0x800000") */ #include <cassert> #incl

hdu 3879 hdu 3917 构造最大权闭合图 俩经典题

hdu3879  base station : 各一个无向图,点的权是负的,边的权是正的.自己建一个子图,使得获利最大. 一看,就感觉按最大密度子图的构想:选了边那么连接的俩端点必需选,于是就以边做点,轻轻松松构造了最大权闭合图.简单题.分分钟搞定. hdu3917 :road  constructions :这题题目看了半天没理解...感觉描述的不好...一个有向图,每条路有响应公司承保,若选了该公司,那么该公司的路必需全部选,还有,该公司的承保的路的下面的一条路对应公司也要选,求最大获利.构

HDU 4961 Boring Sum 构造题

用一个数组c, c[i]表示i这个数出现的最近数字是几. 那么当加入一个6,则 c[1] = c[2] = c[3] = c[6] = 6; ==最近怎么都要开挂啊.. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 100005; inl

HDU 5355 Cake (WA后AC代码,具体解析,构造题)

题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5355 题面: Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1632    Accepted Submission(s): 273 Special Judge Problem Description There are s

HDU 5355 Cake (WA后AC代码,详细解析,构造题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355 题面: Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1632    Accepted Submission(s): 273 Special Judge Problem Description There are m

hdu 4416 水题 浙大计算机研究生复试上机考试-2005年 可是发现自己写代码有问题

Spring3与Hibernate4整合时出现了nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider. hibernate3的时候,用spring来控制sessionfactory用的可以是org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean,因为用的是hibernate4所以照猫画

Codeforces 482 - Diverse Permutation 构造题

这是一道蛮基础的构造题. - k         +(k - 1)      -(k - 2) 1 + k ,    1 ,         k ,             2,    ................... \  /        \  /           \  / k          k-1          k-2 如图所示,先构造第一个数,就是1 + k, 然后接下来每个数字和上个数相差k , k -1 , k -2 这样下来,最后一个数字就是一个中间的数字,过程就

codeforces 459C - Pashmak and Buses 【构造题】

题目:codeforces 459C - Pashmak and Buses 题意:给出n个人,然后k辆车,d天时间,然后每天让n个人选择坐一辆车去上学,要去d天不能有任意两个人乘同一辆车,不能的话输出 -1 分类:数学,构造 分析:这个题目首先得分析,我开始想到的是首先用相同的放在一起,比如 7 2 3 这样构造 1 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 就是需要的天数跟每一行出现次数最多的数的出现次数相等,但是发现还有更优

CodeForces 26C Parquet 构造题

题目链接:点击打开链接 #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> #include <set> using namespace std; #define N 105 int n,m,a,b,c; char s[N][N]; set<char>myset; bool inm