A | 珂朵莉与宇宙 |
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld
空间限制: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
空间限制:C/C++ 65536K,其他语言131072K
64bit IO Format: %lld
题目描述
“这个比赛,归根结底就是控制一个虚拟的小拖拉机跑完整个赛道。一般一场比赛会有 9 个到 13 个赛道,最后看能跑完多少个赛道。”
通常在一场可编程拖拉机比赛中,分别会有实际参赛队伍数 10%、20%、30% 向下取整的队伍获得金、银、铜牌,其余队伍获得荣誉提名,俗称“铁牌”。
但是主办方往往会多准备一些奖牌,那么在发奖牌的时候会按照比例向上取整发出的奖牌以减少浪费,就会有一些原本获得银牌的队伍获得了金牌。
现在给出一个赛区的规模,也就是这个赛区的实际参赛队伍数,小 Q 同学想知道有多少队伍的奖牌会由银变金、由铜变银、由铁变铜。
通常在一场可编程拖拉机比赛中,分别会有实际参赛队伍数 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
空间限制: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
空间限制: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