牛客每日練習----沒有名字,計算天數,最短路徑

大提琴的聲音就像一條河,左岸是我無法忘卻的回憶,右岸是我值得緊握的璀璨年華,中間流淌的,是我年年歲歲淡淡的感傷。

鏈接:https://ac.nowcoder.com/acm/problem/14532
來源:牛客網
 

題目描述

tabris實在是太菜了,沒打敗惡龍,在綠島也只撿到一塊生鐵回去了,爲了不在繼續拉低acimo星球的平均水平逃離地球,來到了Sabi星球.

在這裏tabris發現了一種神奇的生物,這種生物不需要與外界交流,種羣間不同個體能互相維持生命存在及提供生長所需的能量.

每個種羣有N個不同個體,圍成一個圈,每隔一個單位時間都會生長.

在一個單位時間裏,每個個體會向兩邊輻射能量,輻射範圍與強度均爲K,隨着距離的增加輻射強度會減小,距離每增加1輻射強度減小1 ,在這單位時間通過輻射接受的能量會保留,最開始的能量會消耗掉。

對於兩個個體a、b,其中a對b的輻射會使b增加【輻射強度×a最開始的能量值】.

 

總體的改變可以表示成

 

 

注:[∗] * 爲真時爲1 *爲假時爲0

 

現在tabris想知道經過M單位時間後,每個個體的能量值是多少.

輸入描述:


 

輸入一個T,表示測試數據的組數
每個測試數據第一行包含三個正整數N,M,K.
接下來一行包含N個正整數a[i];

T∈[1,200]
N∈[1,200]
K∈[1,⌊n/2⌋]
M∈[1,1018]
a[i]∈[1,106]

輸出描述:

對每組測試樣例輸出經過M單位時候後每個個體的能量,爲了方便起見對1e9+7取模.

示例1

輸入

複製

1
5 1 3
1 1 1 1 1

輸出

複製

6 6 6 6 6
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const ll mod=1000000007;
int T,n,k,a[210],b[210],c[210];
ll m;
void add(int &x,int y)
{
    (x+=y)>=mod&&(x-=mod);
}
void chf(int *f,int *g,int cd)
{
    int tmp[210];
    for(int i=0; i<cd; i++)
        tmp[i]=0;
    for(int i=0; i<cd; i++)
        for(int j=0; j<cd; j++)
            add(tmp[(i+j)%cd],1LL*f[i]*g[j]%mod);
    for(int i=0; i<cd; i++)
        f[i]=tmp[i];
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%lld%d",&n,&m,&k);
        for(int i=0; i<n; i++)
            scanf("%d",&a[i]);
        for(int i=0; i<n; i++)
            b[i]=(i==0);
        for(int i=0; i<n; i++)
        {
            int d=min(i,n-i);
            c[i]=(d>0&&d<k)*(k-d);
        }
        while(m)
        {
            if(m&1)
                chf(b,c,n);
            chf(c,c,n);
            m>>=1;
        }
        chf(a,b,n);
        for(int i=0; i<n; i++)
            printf("%d ",a[i]);
        printf("\n");
    }
    return 0;
}

鏈接:https://ac.nowcoder.com/acm/problem/14558
來源:牛客網
 

題目描述

輸入某年某月某日,判斷這一天是這一年的第幾天。(閏年:能被4整除且不能被100整除的爲閏年,世紀年能被400整除的是閏年)

輸入描述:

輸入某年某月某日

輸出描述:

輸出這是當前輸入年份的第幾天

示例1

輸入

複製

2017
12
4

輸出

複製

338
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
int y,m,d,sum;
int main()
{
    cin>>y>>m>>d;
    int s[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
    if((y/4==0&&y/100!=0)||(y/400==0))
        s[1]=29;
    sum+=d;
    for(int i=0; i<m-1; i++)
        sum+=s[i];
    cout<<sum<<endl;
    return 0;
}

鏈接:https://ac.nowcoder.com/acm/problem/14697
來源:牛客網
 

題目描述

現在給出一幅有向圖(有重邊,無自環),問你多少組點對滿足他們之間的最短路=d,輸出點對的個數。

輸入描述:

第1行輸入三個整數n,m,d,表示圖的點數,邊數和查詢的值。
第2-m+1行,每行輸入三個整數s,t,v,表示邊的起點,終點和邊權。
數據保證:0<n≤50,0<m≤5000,0<d≤5000,0<s,t≤n,0<v≤100。

輸出描述:

輸出一行,一個整數表示滿足條件的點對個數。

示例1

輸入

複製

2 2 1
1 2 1
2 1 2

輸出

複製

1

說明

只有1到2的最短路是1,所以只有1個。

示例2

輸入

複製

2 2 1
1 2 1
2 1 1

輸出

複製

2

說明

1到2和2到1的最短路都是1,所以有2個。

備註:

(s,t)和(t,s)是兩組不同的點對
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
int e[100][100],n,m,d,s,t,v,ct;
int main()
{
    scanf("%d%d%d",&n,&m,&d);
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d%d",&s,&t,&v);
        e[s][t]=v;
    }
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                if(e[i][j]>e[i][k]+e[k][j])
                    e[i][j]=e[i][k]+e[k][j];
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(i!=j&&e[i][j]==d)
                ct++;
    printf("%d\n",ct);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章