Y 老师的乐高小镇
链接:https://ac.nowcoder.com/acm/contest/3667/I
来源:牛客网
题目描述
Y 老师从小喜欢用乐高搭建自己喜欢的模型,这不突然有一天 Y 老师想用乐高建造一个神奇的小镇。小镇由无穷所不同的建筑物组成(假设 Y 老师有魔法),但是 Y 老师是一个有着强迫症的中二青年,所以一条街道如果修建了一定数量的乐高建筑,那么下个街道一定会修其两倍数量的乐高建筑,并且现在已知第一条街道只有一所乐高建筑。由于元旦佳节的临近,Y 老师还想继续为它的乐高城市添灯结彩,假设 Y 老师现在手上有 k 个装饰品,并且 Y 老师一天必须为一条街道的所有建筑都挂上一个装饰品(如果 Y 老师不能为这条街道的所有建筑挂上装饰品的话,Y 老师是不会选择这条街道的,而且 Y 老师一天只会选择一条街道),请问这 k 个装饰品最少多少天挂完呢 ?
输入描述:
多组输入
每行一个整数 k (1<=k<=1e15)
输出描述:
最少的天数
示例1
输入
3
输出
2
说明
Y 老师两天分别选择第一条街和第二条街
备注:
多组输入
思路:把k转成2进制,数有多少个1就行
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h> 6 #include <algorithm> 7 #include <vector> 8 #include <queue> 9 #include <set> 10 #include <stack> 11 #include <map> 12 #include <sstream> 13 const int INF=0x3f3f3f3f; 14 typedef long long LL; 15 const int mod=1e9+7; 16 const int maxn=2*1e6+10; 17 using namespace std; 18 19 int main() 20 { 21 LL n; 22 while(~scanf("%lld",&n)) 23 { 24 int day=0; 25 LL t; 26 while(n) 27 { 28 t=n%2; 29 if(t) day++; 30 n/=2; 31 } 32 printf("%d ",day); 33 } 34 return 0; 35 }
K 小阳数数
链接:https://ac.nowcoder.com/acm/contest/3667/K
来源:牛客网
题目描述
武林内纷乱不断,各地都自立门派,门派的人为了识别门内弟子,给了每个人一块令牌,这个令牌有个神奇的地方,
门派内的弟子的令牌不一定相同,
下面是他的识别规则:
每个人的令牌都是一串数字,如果两个人的令牌有相似的地方,即有相同的数字,那就属于同一个门派,特别的,
如果两个人没有相同的数字,但是这个两个人都和另一个人有相同的数字,那么这三个人同属一个门派,现在有一个任务
,给你n个令牌,让你认出有多少个门派
例如
3
13579
2468
12
这里答案应该是1,因为第一个人和第二个人同时和第三个人有关系
门派内的弟子的令牌不一定相同,
下面是他的识别规则:
每个人的令牌都是一串数字,如果两个人的令牌有相似的地方,即有相同的数字,那就属于同一个门派,特别的,
如果两个人没有相同的数字,但是这个两个人都和另一个人有相同的数字,那么这三个人同属一个门派,现在有一个任务
,给你n个令牌,让你认出有多少个门派
例如
3
13579
2468
12
这里答案应该是1,因为第一个人和第二个人同时和第三个人有关系
输入描述:
第一行 输入一个t,代表数据组数(1<=t<=10)
第二行 输入一个n,代表n块令牌 (1<=n<=1000)
下面n行,每行一个数字序列,(1<=len<=1000)
输出描述:
有t行,每行一个数,代表有这组数据有多少个门派
示例1
输入
2 3 13579 2468 12 5 12 23 34 5 5678
输出
1 2
把每个数字当成一个点,对数字进行并查集操作
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h> 6 #include <algorithm> 7 #include <vector> 8 #include <stack> 9 #include <queue> 10 #include <set> 11 #include <map> 12 #include <sstream> 13 const int INF=0x3f3f3f3f; 14 typedef long long LL; 15 const int mod=1e9+7; 16 const double PI = acos(-1); 17 #define Bug cout<<"---------------------"<<endl 18 const int maxn=1e5+10; 19 using namespace std; 20 21 int fa[10]; 22 23 int find(int x) 24 { 25 while(x!=fa[x]) 26 x=fa[x]; 27 return x; 28 } 29 30 int main() 31 { 32 int T; 33 scanf("%d",&T); 34 while(T--) 35 { 36 int n; 37 scanf("%d",&n); 38 char str[1005]; 39 int vis[10]={0}; 40 for(int i=0;i<10;i++) 41 fa[i]=i; 42 for(int i=1;i<=n;i++) 43 { 44 scanf("%s",str); 45 vis[str[0]-'0']=1; 46 int t=str[0]-'0'; 47 for(int i=1;str[i];i++) 48 { 49 vis[str[i]-'0']=1;; 50 int x=find(t); 51 int y=find(str[i]-'0'); 52 if(x!=y) 53 fa[x]=y; 54 } 55 } 56 set<int> st; 57 for(int i=0;i<10;i++) 58 { 59 if(vis[i]) 60 st.insert(find(i)); 61 } 62 printf("%d ",st.size()); 63 } 64 return 0; 65 }
-