牛客小白月赛10

小白劝退赛。

A.勘测

题目描述
Actci偶然发现了一个矿洞,这个矿洞的结构类似与一棵二叉树,Actci发现的矿洞恰好位于根节点处,为了尽快挖掘,Actci找来了她的小伙伴们来帮忙,由于地质原因,每天小伙伴们只能打通到一条到子节点的道路(不消耗时间),也就是说每天一个节点只能向一个子节点建设道路,走一条路需要一天的时间,当发现一条道路后,会有一部分小伙伴选择留下来继续勘测,假设小伙伴们有无数个,树的深度足够大,问第n天最多共建设几条道路。
输入描述:
一行,一个数n。
输出描述:
一行,一个数表示最多建设的道路数,答案对 10000000007 取模。
示例1
输入
2
输出
3
说明
样例解释:
设n号点的子节点编号为n×2和n×2+1,根节点编号为1.
第一天1->2,在1,2处留有一部分人,道路数为1。
第二天1->3,2->4,在2,3,4处留有人,道路数为3.
示例2
输入
100
输出
6531708670
备注:
数据范围:
对于100%的数据保证 n≤5×10^6。

解题思路:找规律-->斐波那契数列。注意题目的空间限制,刚开始开两个数组,然后就一直提示编译错误,最后改用几个变量搓搓公式即可。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL mod=10000000007;
 5 LL ans,pre1,pre2,now;int n;
 6 int main(){
 7     while(cin>>n){
 8         ans=1,pre1=1,pre2=1;
 9         for(int i=2;i<=n;++i){
10             now=(pre1+pre2)%mod;
11             ans=(ans+now)%mod;
12             pre1=pre2,pre2=now;
13         }
14         cout<<ans<<endl;
15     }
16     return 0;
17 }

B.数学

题目描述
某年某月某天的数学课上,Actci正在遨游宇宙呢,对于他的屡教不改,她的数学老师决定难为一下Actci,将他叫醒。
“咳咳,我现在给出一个数a( 0a10^10000),判断a是否是3,5,8,11中某些数的的倍数,你只有一秒钟的时间,答不上来的话,呵,%#W$%@#$@...”。
作为他后桌的你怎么能看着Actci“受害”呢,于是你决定帮帮他。
输入描述:
一行,一个数 a。
输出描述:
两行。
第一行输出 Yes 或 No,表示这个数是否是这四个数中一个或几个数的倍数。
第二行,a是哪些数的倍数,每个数用空格隔开(顺序从小到大),若第一行为 No 则不用输出。
示例1
输入
123456789
输出
Yes
3
示例2
输入
2341232402462055420
输出
Yes
3 5
示例3
输入
9741427
输出
No

解题思路:常规做法,只需单独验证4个数字即可,水过。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int maxn=10005;
 5 string str;bool flag,f[5];int ans,mou[4]={3,5,8,11},arr[maxn],siz;vector<int> vec;
 6 int main(){
 7     while(cin>>str){
 8         memset(f,false,sizeof(f)),flag=false;vec.clear();
 9         for(int i=0;str[i];++i)arr[i]=str[i]-'0';
10         for(int j=0;j<4;++j){
11             ans=0;
12             for(int i=0;str[i];++i)ans=(ans*10+arr[i])%mou[j];
13             if(!ans)flag=true,f[j]=true;
14         }
15         if(!flag){puts("No");continue;}
16         puts("Yes");
17         for(int i=0;i<4;++i)
18             if(f[i])vec.push_back(mou[i]);
19         siz=vec.size();
20         for(int i=0;i<siz;++i)
21             cout<<vec[i]<<(i==siz-1?'\n':' ');
22     }
23     return 0;
24 }

C.约数

题目描述
Actci上课睡了一觉,下课屁颠屁颠的去找数学老师补课,问了老师一个题目:
    给出两个数a,b,问a和b的全部公约数是什么?
数学老师一看这道题太简单了,不屑回答,于是就交给了你。
输入描述:
一行两个数a,b.
输出描述:
a和b的全部公约数,每个数字之间空格隔开。
示例1
输入
25 37
输出
1
示例2
输入
25 100
输出
1 5 25
备注:
对于100%的数据,1 ≤ a,b ≤ 10^13

解题思路:先用sqrt(a)(a<=b)的时间求出a的所有因子,然后枚举其所有因子,看是否为b的因子即可。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL a,b;vector<LL> vec1,vec2;int szt;
 5 int main(){
 6     while(cin>>a>>b){
 7         if(a>b)swap(a,b);
 8         vec1.clear(),vec2.clear();
 9         for(LL i=1;i*i<=a;++i){
10             if(i*i==a)vec1.push_back(i);
11             else if(a%i==0)vec1.push_back(i),vec1.push_back(a/i);
12         }
13         for(size_t i=0;i<vec1.size();++i)
14             if(b%vec1[i]==0)vec2.push_back(vec1[i]);
15         sort(vec2.begin(),vec2.end()),szt=vec2.size();
16         for(int i=0;i<szt;++i)
17             cout<<vec2[i]<<(i==szt-1?'\n':' ');
18     }
19     return 0;
20 }

D.饥饿

题目描述
夕阳西下,匆匆忙忙间,SSJ一天的课程已经全部上完了,肚子咕咕开始叫了,坐上回家的公交车,可是SSJ今天好像有点迷,据说今中午吃饭时没去食堂,走着走着,外边景色好美啊,啊?我好像没走过这,完了,我好想迷路了。
公交车到了终点站,SSJ下车了,内心无比紧张,回不去了,一阵冷风吹过,瑟瑟发抖,emm...,那是一张地图?地图上有啥大家都明白,SSJ现在已经饿得无力思考了,请你帮他设计一条最快回家的路下,他要快点回家吃xxx。
输入描述:
第一行四个数n,m,s,t。(分别表示有地图上n个地点,m条道路,SSJ在s处,他家在t处)第2-m+1三个正整数,f,u(某条路起点),v(到达点),w(路径距离)。(f为1或0,0表示这条道路上有恶狗拦路,SSJ已无力与恶狗打斗了,所以他要避开这些道路,1表示此条道路无危险)。
输出描述:
第一行一个数表示最短路径长度,若无法回家输出“My gold!!!”(无引号)若可以回家.
示例1
输入
5 7 1 5
0 1 4 4
1 1 3 2
1 1 5 7
1 2 5 10
0 2 3 1
1 3 5 2
1 4 3 7
输出
4
备注:
n≤10000,m≤200000,w≤5000000
解题思路:最短路,vector建边存图,套个堆优化的迪杰斯特拉算法模板即可。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL inf=1e18+5;
 5 const int maxn=10005;
 6 int n,m,s,t,f,u,v,x,y,z;vector<int> v1[maxn];vector<LL> v2[maxn];bool vis[maxn];LL w,dis[maxn];
 7 priority_queue< pair<LL,int> > que;
 8 void Dijkstra(){
 9     while(!que.empty())que.pop();
10     memset(vis,false,sizeof(vis));
11     dis[s]=0;que.push(make_pair(-dis[s],s));
12     while(!que.empty()){
13         x=que.top().second;que.pop();
14         if(vis[x])continue;
15         vis[x]=true;
16         for(size_t j=0;j<v1[x].size();++j){
17             y=v1[x][j],z=v2[x][j];
18             if(!vis[y]&&(dis[x]+z<dis[y]))dis[y]=dis[x]+z,que.push(make_pair(-dis[y],y));
19         }
20     }
21 }
22 int main(){
23     while(~scanf("%d%d%d%d",&n,&m,&s,&t)){
24         for(int i=0;i<=n;++i)v1[i].clear(),v2[i].clear();
25         for(int i=0;i<=n;++i)dis[i]=inf;
26         while(m--){
27             scanf("%d%d%d%lld",&f,&u,&v,&w);
28             if(!f)continue;
29             v1[u].push_back(v);///建图:双向边
30             v2[u].push_back(w);
31             v1[v].push_back(u);
32             v2[v].push_back(w);
33         }
34         Dijkstra();
35         if(dis[t]==inf)puts("My gold!!!");
36         else printf("%lld\n",dis[t]);
37     }
38     return 0;
39 }
 
 

转载于:https://www.cnblogs.com/acgoto/p/10163125.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值