zoukankan      html  css  js  c++  java
  • 牛客小白月赛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?'
    ':' ');
    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?'
    ':' ');
    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
    ",dis[t]);
    37     }
    38     return 0;
    39 }
    
    
  • 相关阅读:
    ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
    POJ 1088 滑雪 DP
    UVA 11584 最短回文串划分 DP
    POJ 2531 Network Saboteur DFS+剪枝
    UVa 10739 String to Palindrome 字符串dp
    UVa 11151 Longest Palindrome 字符串dp
    UVa 10154 Weights and Measures dp 降维
    UVa 10271 Chopsticks dp
    UVa 10617 Again Palindrome 字符串dp
    UVa 10651 Pebble Solitaire 状态压缩 dp
  • 原文地址:https://www.cnblogs.com/acgoto/p/10163125.html
Copyright © 2011-2022 走看看