A題
題目描述
星神是來自宇宙的
所以珂朵莉也是吧
所以我就出了個題
給你一個長爲n的序列a,有n*(n+1)/2個子區間,問這些子區間裏面和爲完全平方數的子區間個數
輸入描述:
第一行一個數n 第二行n個數表示序列a
輸出描述:
輸出一個數表示答案
輸入
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題
題目描述
通常在一場可編程拖拉機比賽中,分別會有實際參賽隊伍數 10%、20%、30% 向下取整的隊伍獲得金、銀、銅牌,其餘隊伍獲得榮譽提名,俗稱“鐵牌”。
但是主辦方往往會多準備一些獎牌,那麼在發獎牌的時候會按照比例向上取整發出的獎牌以減少浪費,就會有一些原本獲得銀牌的隊伍獲得了金牌。
現在給出一個賽區的規模,也就是這個賽區的實際參賽隊伍數,小 Q 同學想知道有多少隊伍的獎牌會由銀變金、由銅變銀、由鐵變銅。
輸入描述:
輸入只有一行,包含一個整數 n (10 <= n <= 1000),表示實際參賽隊伍數。
輸出描述:
輸出一行,包含三個由空格分隔的整數,分別表示獎牌會由銀變金、由銅變銀、由鐵變銅的隊伍數。
輸入
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;
}