codevs 1553 互斥的数
有这样的一个集合,集合中的元素个数由给定的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 4
3
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int s[];
map<int,bool>d;
int main()
{
int h,n,p;
cin>>n>>p;
h=;
for(int i=;i<=n;++i)
cin>>s[i];
sort(s+,s++n);
for(int i=;i<=n;++i)
{
if(!d[s[i]])
{
d[s[i]*p]=;
h++;
}
}
cout<<h;
}
哈希 做法 21ms 876KB 1213B
#include <algorithm>
#include <cstdio> using namespace std; struct node
{
int to,next,cs;
bool vis;
}edge[];
int head[],n,p,a[],tot;
int qr()
{
int x=,f=;
char ch=getchar();
while(ch>''||ch<''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+(int)ch-;ch=getchar();}
return x*f;
}
int get_hash1(int k)
{
return k*%;
}
int get_hash2(int k)
{
return k*%;
}
void add(int from,int to)
{
tot++;
edge[tot].next=head[from];
edge[tot].to=to;
head[from]=tot;
}
void change(int u,int v)
{
for(int j=head[u];j;j=edge[j].next)
{
if(edge[j].to==v)
{
edge[j].vis=;
}
}
}
int pd(int u,int v)
{
for(int k=head[u];k;k=edge[k].next)
{
if(edge[k].to==v&&edge[k].vis==)
return true;
}
return false;
}
int main()
{
n=qr();
p=qr();
for(int i=;i<n;++i)
{
a[i]=qr();
int x=get_hash1(a[i]);
int y=get_hash2(a[i]);
add(x,y);
}
sort(a,a+n);
int h=,ans=n;
for(int i=;i<n;++i)
{
int x=get_hash1(a[i]),y=get_hash2(a[i]);
if(pd(x,y))
{
int t=a[i]*p;
int x=get_hash1(t),y=get_hash2(t);
change(x,y);
h++;
}
}
printf("%d\n",h);
return ;
}
codevs 1553 互斥的数的更多相关文章
- codevs——1553 互斥的数
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同 ...
- Codevs No.1553 互斥的数
2016-05-31 21:34:15 题目链接: 互斥的数 (Codevs No.1553) 题目大意: 给N个数,如果其中两个数满足一个数是另一个的P倍,则称它俩互斥,求一个不互斥集合的最大容量 ...
- 【wikioi】1553 互斥的数(hash+set)
http://wikioi.com/problem/1553/ 一开始我也知道用set来判a[i]/p是否在集合中,在的话就直接删掉. 但是我没有想到要排序,也没有想到当存在a,b使得a/p==b时到 ...
- codevs1553 互斥的数
1553 互斥的数
- 互斥的数(hash)
1553 互斥的数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定, ...
- 互斥的数(codevs 1553)
题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知 ...
- codevs 1166 矩阵取数游戏
二次联通门 : codevs 1166 矩阵取数游戏 /* codevs 1166 矩阵取数游戏 SB区间dp dp[l][r] = max (dp[l + 1][r] + number[l], dp ...
- T1553 互斥的数 codevs
http://codevs.cn/problem/1553/ 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y ...
- 【CodeVS 1037】取数游戏
http://codevs.cn/problem/1037/ Alice必胜是Alice将硬币移向边权为0的一端并且把经过的边变为0,让BoB无路可走. 这样只要起点到两个方向最近的0边权的端点的边数 ...
随机推荐
- linux命令:rsync
Rsync的命令格式可以为以下六种: rsync [OPTION]... SRC DEST rsync [OPTION]... SRC [USER@]HOST:DEST rsync [OPTION]. ...
- 免证书发布ipa文件真机测试
首先设备得越狱 众所周知,在Xcode上开发的程序只能在模拟器中运行,如果要放到真机上则要花费99美金购买开发者证书iDP.这严重阻碍了我等草根开发者探索的脚步.写个小程序,同学间分享一下这个小小的愿 ...
- dom4j的解析实例
book.xml数据如下: <books> <book> <author>Thomas</author> <title>Java从入门到放弃 ...
- cocos2dx 新手引导
static CCClippingNode* create(); //使用一个节点作为模版创建裁剪节点 static CCClippingNode* create(CCNode *pStencil); ...
- vue中使用chart.js
1,安装chart.js和vue-chart.js npm install chart.js --save npm install vue-chart.js --save 2,独立文件,方便修改 封装 ...
- GenericKeychain
KeychainItemWrapper是apple官方例子“GenericKeychain”里一个访问keychain常用操作的封装类,在官网上 下载了GenericKeychain项目后,只需要把“ ...
- perl C/C++ 扩展(四)
在前面三篇博客中,我们了解到如何使用c/c++ 扩展自己的perl 库,但是博主在学习过程中,对动态库或静态库的加载不是十分了解,后来自己又细挖一下.后来就有了这篇博文,再后来,没有再后来了,囧!! ...
- 01 | VIM基础攻略
启动 vim 后,vim 处于 normal 模式. Step One: "i" -> insert 模式, ESC -> normal 模式: "x&quo ...
- Eclipse 修改编码方式
1.修改全局(Eclipse默认)文本编码方式 2.修改某个工程编码方式 右键工程点击”属性“后,如下图
- PostgreSQL-7-数据连接
1.通过WHERE进行简单连接 SELECT * FROM company3,department 不添加WHERE将会显示所有数据 SELECT * FROM company3,departmen ...