肇庆学院"菜鸟杯"程序设计竞赛2019(同步赛)部分解题(一)

A-解锁专家

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

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

    阿炳是一个精通文理的小机灵鬼,它是一个解锁专家,也是一个诗人。一天,阿炳受邀前往黄台甫马哈那坤弃他哇劳狄希阿由他亚马哈底陆浦欧叻辣塔尼布黎隆乌冬帕拉查尼卫马哈洒坦,也就是今天俗称的曼谷,解一个被文字锁锁住的宝箱。
    文字锁是这样描述的,
对于给定的一个n,问存在多少正整数x满足:
1、x>0;
2、x二进制位的位数不超过n,例如5=101(2),它的二进制位的位数就是3;
3、x的二进制形式,不存在连续的两个二进制位上的数都是1。例如 3=11(2),则不满足条件,但是5=101(2) 则满足条件。
阿炳思考了5分钟后,望着山下的美景,不禁写起了诗:
                            飞花两岸照船红,
                            波光山色两盈盈。
                            那年私语小窗边,
                            妾心陌上悠扬蝶。
原来阿炳不会解,为了掩饰尴尬,只好作诗缓解一些尴尬的气氛,阿炳作为一个知名解锁专家,当然是要面子的嘛,所以,阿炳请你帮帮他解决这个问题。

输入描述:

多测试数据样例,测试样例组数不超过10000;
每组数据一行,一个数n(1 ≤ n ≤ 100)。

输出描述:

每组数据输出一个数,满足条件的正整数x的个数取模433494437(即答案需要%433494437)
示例1

输入

复制
1

输出

复制
1

说明

当n=1时,只有x=1满足条件。
示例2

输入

复制
3

输出

复制
4

说明

当n=3时,有x=1(001), x=2(010), x=4(100), x=5(101)共4种情况。




解题思路:
这一题就是一个简单的dp,或者说是找规律
公式是num[i]=num[i-1]+num[i-2]+1
思考的过程是这样的:
比如说有五位的时候,除了四位的所有(就是num[i-1])之外,还应该包括的是10开头然后后面有三位的个数(这里就是num[i-2]),当然还有10000它本身要加上
所以他的递推式就是
num[i]=num[i-1]+num[i-2]+1

下附代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn=1005;
 5 typedef long long ll;
 6 int n;
 7 
 8 ll num[maxn];
 9 ll out[maxn];
10 
11 void init()
12 {
13     num[1]=1;
14     num[2]=2;
15     num[3]=4;
16     for(int i=4;i<105;++i)
17     {
18         num[i]=num[i-1]+num[i-2]+1;
19         num[i]=num[i]%433494437;
20     }
21     /*for(int i=1;i<105;++i)
22     {
23         out[i]=num[i]%433494437;
24     }*/
25 }
26 
27 int main()
28 {
29     init();
30     while(cin>>n)
31     {
32         cout<<num[n]<<endl;
33         //cout<<out[n]<<endl;
34     }
35     return 0;
36 }

C-最大模数

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

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

    一次周六新生训练后,一个师妹来找JAJA_Xin。
师妹:“师兄,为什么今天我对面那个师兄那么冷漠。”
JAJA_Xin:“噢你居然还不认识大名鼎鼎的魏队,正常啦,魏队很傲的,因为你们太菜,所以你懂的。”
师妹:“那怎么才能让那个师兄觉得我不菜,你可以帮我去问问吗?”
    乐于助人的JAJA_Xin怎么可能拒绝师妹呢,跑去问魏队。
魏队:“简单啊,我出一道题,能做出来就不算很菜了,就出一道数学题吧,简单一点,让他们可以做。”

                              Ra = [ (a−1)n + (a+1)n ] %a2 ,(n>0)

例如当a=4, n=2时,Ra=32 +52 =34,而34%16 =2,故Ra=2。由于n可以是任意大于0的正整数,所以存在很多Ra的解,找到任意一个Ra就算做出来这道题。例如,当a=4的时候,Ra的取值可以是2或者是8。

    “你怎么这么有空还管闲事,不赶紧去补题吗...”,JAJA_Xin被魏队一顿说了之后闷闷不乐,不小心就把原题意记成了要找到最大的Ra才能算做出来这道题,并把修改的题意后和师妹说了,这可难到他们了。例如,当a=4的时候,Ra_max=8。

输入描述:

多测试用例,用例不超过10000个。
每个用例有一行数据,一个整数a (3≤a≤1000000)。

输出描述:

对于每个用例输出一行,Ra_max。

示例1

输入

复制
4
7

输出

复制
8
42
解题思路:
先是用快速幂找了一下规律,一开始设置n是1-10,感觉不太对,然后就将n设置成了1-20
然后就找到了规律
你会发现有
3  6
4  8
5  20
6  24
7  42
8  48
9  72
10  80
即对于整数n,她所对应的结果应该是
res=(n-1)/2*2*n;

代码如下:
 1 #include<bits/stdc++.h>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5 
 6 const int maxn=100005;
 7 typedef long long ll;
 8 int a;
 9 //这里找规律时候用的快速幂,解题时未用到
10 long long quickPow(long long a, long long b)
11 {
12     long long res = 1;
13     while (b > 0)
14     {
15         if (b & 1)
16             res = res * a;
17         a = a * a;
18         b >>= 1;
19     }
20     return res;
21 }
22 
23 int main()
24 {
25 
26     while(cin>>a)
27     {
28         int b=(a-1)/2*2;
29         ll ans=a*b;
30         cout<<ans<<endl;
31     }
32     return 0;
33 }
 
      
     

D-米多立亚

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

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
 
     

题目描述

 
     
    米多立亚少年此时正在学习one for all全覆盖5%,但是他不想努力了,于是哆啦A梦拿出神奇道具帮助米多立亚少年,让他可以1分钟学会全覆盖。当米多立亚少年使用这个道具的时候,道具的屏幕上会出现一个字符串(只由'0' , '1' , '2' 三种字符构成) 。
    这些字符串有如下的交换规则:对于相邻的两个字符,'01'可以变成'10' , '10'可以变成'01' , '12'可以变成'21' , '21'可以变成'12',可以交换无数次。
    米多立亚少年需要尽快反馈给道具一个最小字典序的字符串,你可以帮助他吗?

输入描述:

多组测试用例,保证 ∑|s|≤ 5*10
7

每组测试用例一行,表示道具屏幕上出现的只包含‘0’,‘1’,‘2’的字符串s,(0<|s| ≤ 10
6
,|s|为字符串s的长度)

输出描述:

输出交换后的最小字典序的字符串
示例1

输入

复制
101022
01010120
0121021

输出

复制
001122
00011120
0111202
解题思路:
你在尝试及变换之后会发现,2的首次出现是很关键的一个节点
举个例子比如说201 最后只能变换成120是最小的字典序
就可以发现
对于2前面的0,它一定能够全部移到最前面
而对于所有的1,他一定都能移动到0和2之间
而对于2后面的0和2,他们的相对位置是不会发生改变的
所以,只要记录一下2前面的0的个数以及1的个数以及后面的2和0的相对位置就行了

代码如下:
 1 #include<bits/stdc++.h>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5  
 6 const int maxn=100005;
 7 typedef long long ll;
 8 int a;
 9  
10  
11 int main()
12 {
13     string str;
14     while(cin>>str)
15     {
16         string res;
17         bool flag=true;
18         int znum=0;
19         int onenum=0;
20         for(int i=0; i<str.size();++i)
21         {
22             if(str[i]=='1')
23             {
24                 onenum++;
25                 continue;
26             }
27             if(str[i]=='2')
28                 flag=false;
29             if(flag&&str[i]=='0')
30                 znum++;
31             if(!flag)
32                 res+=str[i];
33         }
34         for(int i=0; i<znum; i++)
35             printf("0");
36         for(int i=0; i<onenum; i++)
37             printf("1");
38         cout<<res<<endl;
39     }
40     return 0;
41 }
 
      
      
     

F-参赛

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

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

    jx队长半夜@小胖:你快出一道签到题呀,简单点的,不行打你啊。小胖吓得赶紧下床想题,边想边和jx队长吹水,想起了参加acm的种种经历。有感而发和jx队长说了想法之后,jx队长:你这什么题意,不行啊太难了,我来改。一顿争辩之后小胖折服了,内心:jx队长牛逼。jx队长:睡吧睡吧,找时间请你喝奶茶。
    众所周知:icpc赛制中,一支队伍由三个队员和一个教练组成,一个教练可以兼任多个队伍的教练;天梯赛赛制中,一支队伍由十个队员组队和一个教练组成,一个教练可以兼任多个队伍的教练;同时,一个队员可以同时参与两种比赛,但不能同时参与同一比赛的不同队伍。
    如果参赛队的Q群里教练和队员的人数共有n人,参赛队是否刚好所有人都能同时组成队伍参赛?

输入描述:

多测试用例
每组测试用例一行,包括一个整数n(1≤n≤300),表示群内的人数有n人

输出描述:

对于每组测试用例
如果所有人都能同时参加两种比赛,请输出All;
如果所有人都能同时参加icpc但不能同时参加天梯赛,请输出First;
如果所有人都能同时参加天梯赛不能同时参加icpc,请输出Second;
否则请输出No。
示例1

输入

复制
11
7
9
10
100

输出

复制
All
First
No
First
First

说明

11可以分为 一支天梯赛的队伍和一个教练 或者 三支icpc的队伍和两个教练,所以输出All。
7只能分为 两支icpc的队伍和一个教练,所以输出First。
解题思路:
因为教练会影分身之术,所以我们只要看他们的总人数相对于3和10的关系
如果他是3的整数倍,你就要拆开一组来充当教练,那么剩下的队伍的数量应该是不小于3的
如果不是3的整数倍,那么他的队伍的数目一定要大于多出来的人的个数
同时,10的情况也可以这样考量

代码如下:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn=1005;
 5 typedef long long ll;
 6 int n;
 7 
 8 int main()
 9 {
10     while(cin>>n)
11     {
12         bool first=false;
13         bool second=false;
14         int a=n/3;
15         int b=n%3;
16         int c=n/10;
17         int d=n%10;
18         if(b==0)
19         {
20             if(a>=4)
21                 first=true;
22         }
23         else
24         {
25             if(b<=a)
26                 first=true;
27         }
28         if(d==0)
29         {
30             if(c>=11)
31                 second=true;
32         }
33         else
34         {
35             if(d<=c)
36                 second=true;
37         }
38         if(first&&second)
39             cout<<"All"<<endl;
40         else if(first)
41             cout<<"First"<<endl;
42         else
43             cout<<"No"<<endl;
44     }
45     return 0;
46 }
 
      
      
     

G-数数有多少水坑

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

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

    有一个由26个小写字母构成的n*m的矩阵(1≤n,m≤1000)。上下左右四连通的区域内有 'j','e','s','i' 这四个小写字母就属于同一个水坑,其余字母则代表地面。 请问该矩阵内有多少个水坑?

输入描述:

多组测试用例,保证 ∑(n*m)≤10 7
每组测试第一行输入两个整数,分别为行数n和列数m;

接下来n行每行输入m个字符(字符只包含小写字母)。

输出描述:

输出水坑的总个数

示例1

输入

复制
5 8
aajessie
jejeaaaa
aaaaaaaa
jaajeaaa
aaaaaaaa

输出

复制
3
解题思路:
这题看似有26个英文字母,但是对应的其实只有0和1两种情况,就是要么是水,要么就是陆地
之后,我们只要扫描一遍全图
只要扫到水,就把这个水周围全部扫一遍,然后填上土,同时计数器+1
完成!

代码如下:
 1 #include<bits/stdc++.h>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5 
 6 const int maxn=1005;
 7 typedef long long ll;
 8 int n,m;
 9 
10 int maps[maxn][maxn];
11 
12 
13 void delit(int i,int j)
14 {
15     maps[i][j]=0;
16     if(maps[i-1][j]==1)
17         delit(i-1,j);
18     if(maps[i+1][j]==1)
19         delit(i+1,j);
20     if(maps[i][j-1]==1)
21         delit(i,j-1);
22     if(maps[i][j+1]==1)
23         delit(i,j+1);
24     return;
25 }
26 
27 int main()
28 {
29 
30     while(cin>>n>>m)
31     {
32         char c;
33         int ans=0;
34         memset(maps,0,sizeof(maps));
35         for(int i=1;i<=n;++i)
36         {
37             for(int j=1;j<=m;++j)
38             {
39                 scanf(" %c", &c);
40                 if(c=='j'||c=='e'||c=='s'||c=='i')
41                 {
42                     maps[i][j]=1;
43                 }
44                 else
45                 {
46                     maps[i][j]=0;
47                 }
48             }
49         }
50         for(int i=1;i<=n;i++)
51         {
52             for(int j=1;j<=m;++j)
53             {
54                 if(maps[i][j]==1)
55                 {
56                     delit(i,j);
57                     ans++;
58                 }
59             }
60         }
61         cout<<ans<<endl;
62     }
63     return 0;
64 }
 
     
 
         

猜你喜欢

转载自www.cnblogs.com/bethebestone/p/12115824.html
今日推荐