百度之星程序设计大赛初赛每场几题

百度之星程序设计大赛初赛每场几题,第1张

4题。百度之星,又名Astar,是由全球最大的中文搜索引擎公司百度,面向中国高校学生和编程爱好者所举办的高水平的程序设计大赛,根据比赛规则,2022年百度之星程序设计大赛的初赛是每场4题的,该比赛自2005年起已成功举办十六届,已成为校园程序高手交流切磋的优秀竞赛平台。

这个问题看起来不是很简单,需要设计一个算法:

先讲数学:

设:

an=a+(n-1)*d (这里d=1)

a1=a

an=a+n-1

sn=(a1+an)n/2=(2a-1+n)/2

再回到这个编程上来:

我们的输入数据其实就是sn,需要找到以a开始的n个连续的递增数列使得和为sn。

这里我们可以用循环来判定,给定一个n,sn已知,就可以求出a,如果a为正整数那么就可以找到等差数列的首项,加上n给定,d=1,那么就可以写出这个和式子。

代码如下:

#include<stdio.h>

void main()

{

int input,i,n,flag

float a//等差数列的首项不一定为整数

flag=0

printf("输入判断的整数:\n")

scanf("%d",&input)

for(n=2n<=inputn++)

{

a=(2*input+n-n*n)/(2.0*n)//求的首项

if(int(a)==a&&a>0)//如果为整整数,则满足要求

{

printf("%d=%d",input,int(a))//输出的序列为整数,a实质是整数,那么强制转化类型不影响结果

for(i=1i<=n-1i++)

printf("+%d",int(a+i))//等差数列的其他项也为整数,a+i实质是整数,装换类型

printf("\n")

flag++//flag记录满足要求的数列数

}

}

if(flag==0)   //flag初始为0,通过上面的循环,如果有满足的在则不为0,为0则说明不能写成等差数列

printf("%d不能被表示成n连续正整数之和\n",input)

}

var a,k:array[0..1000000]of longint

b,c,d,e,f,g,h,i,j,l,n,m,mid:longint

begin

assign(input,'count.in')

assign(output,'count.out')

reset(input)

rewrite(output)

read(b,f)

e:=0

n:=0

l:=1

for c:=1 to b do

begin

read(d)

k[d]:=k[d]+1

end

while l<=b do

begin

for m:=1 to k[n] do

begin

a[l]:=n

l:=l+1

end

n:=n+1

end

e:=0

for c:=1 to b do

begin

i:=c+1

j:=b

while (j>=i) do

begin

mid:=(j+i) div 2

if a[mid]+a[c]>f then j:=mid-1 else i:=mid+1

end

e:=e+(j-c)

end

writeln(e)

close(input)

close(output)

end.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7826659.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存