Wannafly挑战赛5

A珂朵莉与宇宙
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld

题目描述

星神是来自宇宙的

所以珂朵莉也是吧

所以我就出了个题

给你一个长为n的序列a,有n*(n+1)/2个子区间,问这些子区间里面和为完全平方数的子区间个数

输入描述:

第一行一个数n
第二行n个数表示序列a

输出描述:

输出一个数表示答案
示例1

输入

6
0 1 0 9 1 0

输出

11

备注:

 
 

1 <= n <= 100000

0 <= ai <= 10

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int maxn=1e7+7;

typedef long long LL;
LL sum[maxn],pos[maxn];

int main ()
{
    LL n;
    scanf("%lld",&n);
    sum[0]=0;
    /**
    咋们可以走一个连续和,联想b-a=i*i;
    移项得到的是b-i*i=a;
    所以这个就是很简单的一个哥德巴赫猜想了;
    这个最灵性的地方就是那个pos数组了;
    直接记录的在当前sum数组前的平方数的个数;
    枚举0->sum[i];只要满足条件都是可以选择的;
    算法时间复杂度为1e5*1e3;
    
    */
    for(LL i=1;i<=n;i++)
    {
        scanf("%lld",&sum[i]);
        sum[i]+=sum[i-1];
    }
    LL ans=0;
    pos[0]=1;
    for(LL i=1;i<=n;i++)
    {
        for(LL j=0;j*j<=sum[i];j++)///一一进行枚举;
            ans+=pos[sum[i]-j*j];
            pos[sum[i]]++;///每次走的时候都需要将它存在的满足条件的个数加一;
    }
    printf("%lld\n",ans);
    return 0;
}

B可编程拖拉机比赛
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld

题目描述

“这个比赛,归根结底就是控制一个虚拟的小拖拉机跑完整个赛道。一般一场比赛会有 9 个到 13 个赛道,最后看能跑完多少个赛道。”
通常在一场可编程拖拉机比赛中,分别会有实际参赛队伍数 10%、20%、30% 向下取整的队伍获得金、银、铜牌,其余队伍获得荣誉提名,俗称“铁牌”。
但是主办方往往会多准备一些奖牌,那么在发奖牌的时候会按照比例向上取整发出的奖牌以减少浪费,就会有一些原本获得银牌的队伍获得了金牌。
现在给出一个赛区的规模,也就是这个赛区的实际参赛队伍数,小 Q 同学想知道有多少队伍的奖牌会由银变金、由铜变银、由铁变铜。

输入描述:

输入只有一行,包含一个整数 n (10 <= n <= 1000),表示实际参赛队伍数。

输出描述:

输出一行,包含三个由空格分隔的整数,分别表示奖牌会由银变金、由铜变银、由铁变铜的队伍数。
示例1

输入

115

输出

1 1 2

说明

按照下取整规则只发 11 块金牌的话,第 12 名原本是银牌,但是按照上取整规则发 12 块金牌,第 12 名是金牌,就由银变金了。
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int main ()
{
    double n;
    scanf("%lf",&n);
    int a=floor(n*0.1),aa=ceil(n*0.1);
    int b=floor(n*0.2),bb=ceil(n*0.2);
    int c=floor(n*0.3),cc=ceil(n*0.3);
    int k3=aa-a;
    int k1=cc+bb+aa-a-b-c;
    int k2=c-(cc-k1);printf("%d %d %d\n",k3,k2,k1);
    return 0;
}

C标准差

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
Special Judge, 64bit IO Format: %lld

题目描述

对于一张n个点m条边的有向图,边上有边权w e,你需要找到一条1到n的路径使得经过的边的标准差最小。
x 1,x 2,...,x k的标准差计算方法如下:
 设
则标准差
note:这条路径不一定要是简单路径。

输入描述:

第一行两个整数n,m。
接下来m行每行三个数u,v,x表示u指向v有一条权为w的边。

输出描述:

 输出一行一个实数,你的答案和标准答案相对误差或者绝对误差不超过10-6就算正确。
示例1

输入

2 1 1 2 3

输出

0

备注:

20%的数据,n ≤ 10, 0 ≤ w ≤ 300,没有重边。
30%的数据,n ≤ 20, m ≤ 100, 0 ≤ w ≤ 20, u < v。
30%的数据,n ≤ 20, m ≤ 50, 0 ≤ w ≤ 20。
20%的数据,n ≤ 30, m ≤ 100, 0 ≤ w ≤ 100。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

const int maxn=1e3+7;
typedef long long LL;
const double inf=0x3f3f3f3f*1.0;

int n,m,judge_val[maxn],val[maxn],head[maxn];
double ans=inf;
struct node
{
    int to,w,pre;
}eage[maxn];

void Add(int i,int u,int v,int w)///前向星建图;
{
    eage[i].to=v;
    eage[i].w=w;
    eage[i].pre=head[u];
    head[u]=i;
}

double getans(int l,int r)///get标准差;
{
    double temp=0,ans1=0;
    for(int i=l;i<=r;i++)
        temp+=val[i];
    temp/=(r-l+1);
    for(int i=l;i<=r;i++)
        ans1+=(temp-val[i])*(temp-val[i]);
        ans1/=(r-l+1);
    return ans=min(ans,ans1);;
}

void dfs(int u,int num)///这个题呢最邪门的地方就是每次动一个节点都需要去更新一回,因为没次的下一步都可能是标准差最小的时候。
{
    judge_val[u]=num;
    for(int i=head[u];i!=-1;i=eage[i].pre)///形式类似于跑最短路;
    {
        int v=eage[i].to;
        val[num]=eage[i].w;///用val记录到每一个点的权值
        if(judge_val[v]) ans=min(ans,getans(judge_val[v],num));///中途记录每一个位置,顺便看一下跑没跑过,跑过的话以它为初始边->num;
        else if(v==n) ans=min(ans,getans(1,num));///跑到终点记录1->n的标准差;
        else dfs(v,num+1);///继续向深处发展;v->num+1;
    }
    judge_val[u]=0;///记得将以前跑过的点归0;
}

int main ()
{
    memset(head,-1,sizeof(head));
    scanf("%d %d",&n,&m);
    for(int i=0;i<m;i++)
    {
        int u,v,w;
        scanf("%d %d %d",&u,&v,&w);
        Add(i,u,v,w);
    }
    dfs(1,1);
    ans=sqrt(ans);
    printf("%.6f\n",ans);
    return 0;
}

D子序列
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给定一个小写字母字符串T

求有多少长度为m的小写字母字符串S满足,T是S的一个子序列(不需要连续)

输入描述:

第一行一个字符串T
第二行一个正整数m

输出描述:

输出答案对109+7取模的值
示例1

输入

a
2

输出

51

说明

长度为2的里面有a的串有51种

备注:

1<=|T|,m<=105

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值