Advertisement

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)

还没有任何评论哟~