吉首大学第九届"新星杯"大学生程序设计大赛

 

 

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 
 2 #include <string.h>
 3 #include 
 4 #include <string>
 5 #include 
 6 #include 
 7 #include 
 8 #include 
 9 #include <set>
10 #include 
11 #include 
12 #include 
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\n",day);
33     }
34     return 0;
35 }

 

 

 

 

 

 

 

 

K 小阳数数

链接:https://ac.nowcoder.com/acm/contest/3667/K
来源:牛客网

题目描述

武林内纷乱不断,各地都自立门派,门派的人为了识别门内弟子,给了每个人一块令牌,这个令牌有个神奇的地方,
门派内的弟子的令牌不一定相同,
下面是他的识别规则:
每个人的令牌都是一串数字,如果两个人的令牌有相似的地方,即有相同的数字,那就属于同一个门派,特别的,
如果两个人没有相同的数字,但是这个两个人都和另一个人有相同的数字,那么这三个人同属一个门派,现在有一个任务
,给你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 
 2 #include <string.h>
 3 #include 
 4 #include <string>
 5 #include 
 6 #include 
 7 #include 
 8 #include 
 9 #include 
10 #include <set>
11 #include 
12 #include 
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<<"---------------------"<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\n",st.size());
63     }
64     return 0;
65 }

 

 

 

 

 

 

-

你可能感兴趣的:(吉首大学第九届"新星杯"大学生程序设计大赛)