1. 程式人生 > >牛客小白賽簽到題

牛客小白賽簽到題

A

連結:https://ac.nowcoder.com/acm/contest/280/A
來源:牛客網
 

勘測

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

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×106

思路:

多寫幾組資料就發現ans[n] = (ans[i - 1] + fibo[i] + fibo[i - 1] )% 1e10 + 7;

程式碼:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 1e10 + 7;
const int maxn = 5e6 + 2;
ll a[maxn],f[maxn];
int main()
{
    f[1] = a[1] = 1;
    int n;
    scanf("%d",&n);
    for (int i = 2;i <= n;i ++)
    {
        f[i] = (f[i - 1] + f[i - 2]) % mod;
        a[i] = (a[i - 1] + f[i] + f[i - 1]) % mod;
    }
    printf("%lld\n",a[n]);
    return 0;
}

B

連結:https://ac.nowcoder.com/acm/contest/280/B
來源:牛客網
 

數學

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld

題目描述

某年某月某天的數學課上,Actci正在遨遊宇宙呢,對於他的屢教不改,她的數學老師決定難為一下Actci,將他叫醒。
“咳咳,我現在給出一個數a(0≤a≤1010000),判斷a是否是3,5,8,11中某些數的的倍數,你只有一秒鐘的時間,答不上來的話,呵,%#W$%@#[email protected]”。

 

作為他後桌的你怎麼能看著Actci“受害”呢,於是你決定幫幫他。
 

輸入描述:

一行,一個數 a。

輸出描述:

兩行。
第一行輸出 Yes 或 No,表示這個數是否是這四個數中一個或幾個數的倍數。
第二行,a是哪些數的倍數,每個數用空格隔開(順序從小到大),若第一行為 No 則不用輸出。

示例1

輸入

複製

123456789

輸出

複製

Yes
3

示例2

輸入

複製

2341232402462055420

輸出

複製

Yes
3 5

示例3

輸入

複製

9741427

輸出

複製

No

思路:

3的話很簡單,每個數加一塊能夠除盡3就行,5的話只看個位數是否為0或5,8的話可以判斷後三位的數是否除盡,11的話就是根據同餘定理過一遍,當然,直接全部過一遍也差不多

程式碼:

#include<bits/stdc++.h>
using namespace std;
string s;
vector<int> ve;
int main()
{
    int a1 = 0,a2 = 0;
    cin>>s;
    int len = s.size();
    for (int i = 0;i < len;i ++)
    {
        a2 += s[i] - '0';
        a1 = a1 * 10 + s[i] - '0';
        a1 %= 11;
    }
    if (a2 % 3 == 0) ve.push_back(3);
    a2 = s[len - 1] - '0';
    if (!a2 || a2 == 5) ve.push_back(5);
    a2=s[len-1]-'0'+(s[len-2]-'0')*10+s[len-3]*100;
    if (a2 % 8 == 0) ve.push_back(8);
    if (!a1) ve.push_back(11);
    if (!ve.empty()) puts("Yes");
    else puts("No");
    bool flag = 0;
    for (int i = 0;i < ve.size();i ++)
    {
        if (flag) cout<<' ';
        flag = 1;
        cout<<ve[i];
    }
    return 0;
}

C

連結:https://ac.nowcoder.com/acm/contest/280/C
來源:牛客網
 

約數

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld

題目描述

Actci上課睡了一覺,下課屁顛屁顛的去找數學老師補課,問了老師一個題目:
    給出兩個數a,b,問a和b的全部公約數是什麼?
數學老師一看這道題太簡單了,不屑回答,於是就交給了你。

輸入描述:

一行兩個數a,b.

輸出描述:

a和b的全部公約數,每個數字之間空格隔開。

示例1

輸入

複製

25 37

輸出

複製

1

示例2

輸入

複製

25 100

輸出

複製

1 5 25

備註:

對於100%的資料,1 ≤ a,b ≤ 1013

思路:

直接求出來最大公約數,O(sqrt(n))掃一遍它的因子就好了

程式碼:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f[1000];
ll gcd(ll a,ll b)
{
    return b ? gcd(b,a % b) : a;
}
int main()
{
    ll pos = 0,n,m,x,y;
    scanf("%lld %lld",&n,&m);
    y = gcd(n,m),x = sqrt(y);
    for (ll i = 1;i <= x;i ++)
    {
        if (y % i == 0)
            f[pos ++] = i,f[pos ++] = y / i;
    }
    sort(f,f + pos);
    printf("1");
    for (int i = 1;i < pos;i ++)
        if (f[i] != f[i - 1])
            printf(" %lld",f[i]);
    putchar('\n');
    return 0;
}

D

連結:https://ac.nowcoder.com/acm/contest/280/D
來源:牛客網
 

飢餓

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld

題目描述

夕陽西下,匆匆忙忙間,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

思路:

迪傑斯特拉最短路裸題,據說用long long過不去,不過我本來沒準備過用的int反而一發入魂(笑cry)

程式碼:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn = 1e4 + 10;
struct edge
{
    int to,cost;
    bool friend operator <(edge a,edge b)
    {
        return a.cost > b.cost;
    }
};

vector <edge> ve[maxn];
bool vis[maxn];
int dis[maxn],n,m;
void djk(int s,int t)
{
    for (int i = 0;i <= n;i ++) dis[i] = inf;
    priority_queue<edge> que;
    edge p,p2;
    p.to = s,p.cost = 0;
    dis[s] = 0;
    que.push(p);
    while (!que.empty())
    {
        p = que.top();
        que.pop();
        if (vis[p.to]) continue;
        vis[p.to] = 1;
        for (int i = 0;i < ve[p.to].size();i ++)
        {
            p2 = ve[p.to][i];
            if (!vis[p2.to] && p2.cost + dis[p.to] < dis[p2.to])
            {
                dis[p2.to] = dis[p.to] + p2.cost;
                que.push(edge{p2.to,dis[p2.to]});
            }
        }
    }
    if (dis[t] != inf) printf("%d\n",dis[t]);
    else puts("My gold!!!");
}
int main()
{
    int s,t,u,v,w,f;
    scanf("%d %d %d %d",&n,&m,&s,&t);
    for (int i = 0;i < m;i ++)
    {
        scanf("%d %d %d %d",&f,&u,&v,&w);
        if (f)
        {
            ve[u].push_back(edge{v,w});
            ve[v].push_back(edge{u,w});
        }
    }
    djk(s,t);
    return 0;
}