互斥的数 (Codevs No.1553)

2016-05-31 21:34:15

题目链接: 互斥的数 (Codevs No.1553)

题目大意:

  给N个数,如果其中两个数满足一个数是另一个的P倍,则称它俩互斥,求一个不互斥集合的最大容量

解法:

  听说跟hash有一点关系,不会....

  还是二分图匹配吧

  转化为求最大独立集=N-最大匹配

  裸的匈牙利算法上.外加一个map大法搞搞互斥关系

 1 //互斥的数 (Codevs No.1553)
 2 //二分图匹配
 3 #include<stdio.h>
 4 #include<algorithm>
 5 #include<string.h>
 6 #include<map>
 7 using namespace std;
 8 const int maxn=100010;
 9 int match[maxn];
10 long long a[maxn];
11 map<long long,int>m;
12 struct edge
13 {
14     int to;
15     int next;
16     edge(){}
17     edge(int to,int next):to(to),next(next){}
18 };
19 edge n[maxn*4];
20 int cnt;
21 int head[maxn];
22 bool vis[maxn];
23 int N,P;
24 void insert(int x,int y)
25 {
26     n[++cnt]=edge(y,head[x]);
27     head[x]=cnt;
28     n[++cnt]=edge(x,head[y]);
29     head[y]=cnt;
30     return ;
31 }
32 bool DFS(int x)
33 {
34     for(int i=head[x];i;i=n[i].next)
35     {
36         if(!vis[n[i].to])
37         {
38             vis[n[i].to]=1;
39             if(match[n[i].to]==-1||DFS(match[n[i].to]))
40             {
41                 match[n[i].to]=x;
42                 match[x]=n[i].to;
43                 return 1;
44             }
45         }
46     }
47     return 0;
48 }
49 int Maxmatch()
50 {
51     int ans=0;
52     memset(match,-1,sizeof(match));
53     for(int i=1;i<=N;i++)
54     {
55         if(match[i]==-1)
56         {
57             memset(vis,0,sizeof(vis));
58             if(DFS(i))ans++;
59         }
60     }
61     return ans;
62 }
63 int main()
64 {
65     scanf("%d %d",&N,&P);
66     for(int i=1;i<=N;i++)
67     {
68         scanf("%lld",&a[i]);
69     }
70     sort(a+1,a+N+1);
71     for(int i=N;i>=1;i--)
72     {
73          m[a[i]]=i;
74          int tmp=m[P*a[i]];
75          if(tmp)insert(i,tmp);
76     }
77     printf("%d",N-Maxmatch());
78 }
时间: 2024-10-10 10:14:24

互斥的数 (Codevs No.1553)的相关文章

互斥的数(codevs 1553)

题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥. 输入描述 Input Description 输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9).接下来一行包含N个不同正整数ai(1<=ai<=10^9). 输出描述 Output D

【CODEVS 1553】互斥的数 哈希表

题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥. 输入描述 Input Description 输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9).接下来一行包含N个不同正整数ai(1<=ai<=10^9). 输出描述 Output D

codevs1553 互斥的数

1553 互斥的数 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥. 输入描述 Input Description 输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9).接下来一行包含N个不同正整数ai(1<=ai<=10^9). 输出描

互斥的数(hash)

1553 互斥的数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥. 输入描述 Input Description 输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9)

codevs——1553 互斥的数

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥. 输入描述 Input Description 输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9).接下来一行包

1553 互斥的数

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥. 输入描述 Input Description 输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9)

互斥的数(codevs1553)

题目描述 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥. 输入描述 输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9).接下来一行包含N个不同正整数ai(1<=ai<=10^9). 输出描述 输出一行表示最大的满足要求的子集的元素个数. 样例输入 4 2 1 2 3 

AC日记——丑数 codevs 1246

1246 丑数 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它).这是个对于一个输入的S的丑数集合.注意:我们不认为1 是一个丑数.你的工作是对于输入的集合S去寻找集合中的第N个丑数.longint(signe

tyvj 1884 [NOIP2000T4]方格取数 || codevs 1043 dp

P1884 [NOIP2000T4]方格取数 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 [noip2000T4]方格取数 描述 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例):某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点.在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0).此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数