Wannafly挑戰賽5 -- A(前綴和) B(思維)

A題

題目描述

星神是來自宇宙的

所以珂朵莉也是吧

所以我就出了個題

給你一個長爲n的序列a,有n*(n+1)/2個子區間,問這些子區間裏面和爲完全平方數的子區間個數

輸入描述:

第一行一個數n
第二行n個數表示序列a

輸出描述:

輸出一個數表示答案
示例1

輸入

6
0 1 0 9 1 0

輸出

11

備註:

1 <= n <= 100000

0 <= ai <= 10


題解:

由數據範圍得知,所有的數的和爲 十的六次方 ,開方得到1000

然後由:pre【i】- pre【j】==s*s 推出:pre【i】- s*s == pre【j】

故思路爲:計算pre【i】- s*s 得到一個數,判斷是否出現過

注意:這裏的pre【j】表示在前面是否出現過,所以是在線處理,不能先求完pre【】數組再去計算,因爲 0 的出現可能使得多個pre值相等


#include<bits/stdc++.h>
#define maxn 100005
#define LL long long
int a[maxn],sum[maxn*10];
int main()
{
    int n;
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
 
        sum[0]=1;
        LL ans=0,pre=0;
        for(int i=1;i<=n;i++){
            pre+=a[i];
            for(int s=0;s<=1000&&s*s<=pre;s++)
                ans+=sum[pre-s*s];
            sum[pre]++;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

B題

題目描述

“這個比賽,歸根結底就是控制一個虛擬的小拖拉機跑完整個賽道。一般一場比賽會有 9 個到 13 個賽道,最後看能跑完多少個賽道。”
通常在一場可編程拖拉機比賽中,分別會有實際參賽隊伍數 10%、20%、30% 向下取整的隊伍獲得金、銀、銅牌,其餘隊伍獲得榮譽提名,俗稱“鐵牌”。
但是主辦方往往會多準備一些獎牌,那麼在發獎牌的時候會按照比例向上取整發出的獎牌以減少浪費,就會有一些原本獲得銀牌的隊伍獲得了金牌。
現在給出一個賽區的規模,也就是這個賽區的實際參賽隊伍數,小 Q 同學想知道有多少隊伍的獎牌會由銀變金、由銅變銀、由鐵變銅。

輸入描述:

輸入只有一行,包含一個整數 n (10 <= n <= 1000),表示實際參賽隊伍數。

輸出描述:

輸出一行,包含三個由空格分隔的整數,分別表示獎牌會由銀變金、由銅變銀、由鐵變銅的隊伍數。
示例1

輸入

115

輸出

1 1 2

說明

按照下取整規則只發 11 塊金牌的話,第 12 名原本是銀牌,但是按照上取整規則發 12 塊金牌,第 12 名是金牌,就由銀變金了。

題解:

很簡單看代碼即懂

注意:

這裏不能直接 n*0.6 因爲,這樣不能保證前面的 n * 0.2 是一個整數


#include<bits/stdc++.h>
 
int main()
{
    int x,n;
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF)
    {
        int a1 = floor(n * 0.1);
        int b1 = floor(n * 0.2);
        int c1 = floor(n * 0.3);
 
        int a2 = ceil(n * 0.1);
        int b2 = ceil(n * 0.2);
        int c2 = ceil(n * 0.3);
        printf("%d %d %d\n",a2-a1,a2+b2-a1-b1,a2+b2+c2-a1-b1-c1);
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章