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;
}



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