2020年南海区青少年信息学奥林匹克竞赛(小学甲组) 第5题 恢复数组【题解】
发布时间
阅读量:
阅读量
题目描述
有一个数组a[1...n],但是这个数组的内容丢失了,你要尝试恢复它。已知以下的三个事实:
1、对于1≤i≤n,都有a[i]>0,且所有的a[i]互不相同。即a数组保存的全部都是正整数,且互不相同。
2、x和y一定是属于数组a,且x<y。
3、a数组是递增的数组,且相邻两项的差是相等的。即数组a是等差数列。
容易发现,同时满足上面三个条件的a数组不一定是唯一的。你要输出使得a[n]的值最小的那个a数组(公差也要求最小)。
一批测试数据中包含多个测试案例。其中第一行为一个整数T(2≤T≤100),表示测试用例的数量。后面有T组数据每个测试用例包含三个整数值(满足条件:2≤n≤50且1≤x,y≤50)。
输出格式
共T行,每行n个整数。
样例
样例输入 1
> 1. 5
>
> 2. 2 1 49
>
> 3. 5 20 50
>
> 4. 6 20 50
>
> 5. 5 3 8
>
> 6. 9 13 22
>
>
>
样例输出 1
> 1. 1 49
>
> 2. 10 20 30 40 50
>
> 3. 20 26 32 38 44 50
>
> 4. 3 8 13 18 23
>
> 5. 1 4 7 10 13 16 19 22 25
>
>
>
这道题不得不说是道水题......
直接暴力枚举,1005050*50等于12500000,不会爆时间......
直接做就完事了
话不多说,上代码——
#include<bits/stdc++.h>
using namespace std;
int a,b,c,d,ans,shu[55],qs,jg,s;
int main()
{
scanf("%d",&a);
for(int i=1;i<=a;i++)
{
scanf("%d%d%d",&b,&c,&d);
ans=1000000,qs=100000,jg=100000;//因为是要找最小值,所以答案放大一点
for(int j=1;j<=c;j++)//这里枚举的是起始点
{
shu[1]=j;
if(shu[1]==c)s++;
for(int k=1;k<=d-c;k++)//这里枚举的是间隔
{
s=0;
if(shu[1]==c)s++;
for(int l=2;l<=b;l++)//这里把所有枚举出来
{
shu[l]=shu[l-1]+k;//枚举出它的每个地方应该放什么
if(shu[l]==c||shu[l]==d)s++;//判断它是否两个数都有包含
}
if(s!=2)continue;//如果它不包含那两个数,那后面就不关它事了
if(shu[b]<=ans)//加了等于号就可以保证找到的间隔是最小的,因为起始点里第一个点越近,它的间隔就会越小
{
ans=shu[b];//标记
qs=j;//标记
jg=k;//标记
}
}
}
shu[1]=qs;//从起始点再次枚举
for(int j=2;j<=b;j++)
{
shu[j]=shu[j-1]+jg;
}
for(int j=1;j<=b;j++)
{
printf("%d ",shu[j]);//最后输出,怕的话就用printf和scanf
}
printf("\n");
}
return 0;
}
这道题的确是水题,不过变量有点多,容易能混
各位大佬们,我是新手,不喜勿喷!!!
全部评论 (0)
还没有任何评论哟~
