RT
题目描述
有一个数组a[1..n],但是这个数组的内容丢失了,你要尝试恢复它。已知以下的三个事实:
1、对于1<=i<=n,都有a[i]>0,且所有的a[i]互不相同。即a数组保存的全部都是正整数,且互不相同。
2、x和y一定是属于数组a,且x<y。
3、数组a是等差数列。
容易发现,同时满足上面三个条件的a数组不一定是唯一的。你要输出使得a[n]的值最小的那个a数组,如果a[n]依然相同,输出a[1]最小的。
输入:
多组测试数据。
第一行,一个整数T,表示有T组测试数据。1<=T<=100。
接下来有T行,每行3个整数:n,x,y。2<=n<=50。1<=x,y<=50。
输出:
共T行,每行n个整数
本人代码如下:
#include <bits/stdc++.h>
using namespace std;
int t,n,x,y,minr = 0x3f3f3f3f,minf = 0x3f3f3f3f,amns;//最大的最后一项,最小的第一项,以及公差
int main()
{
cin>>t;
for(int k = 1;k <= t;k ++)
{
cin>>n>>x>>y;
if(n == 2)
{
cout<<x<<' '<<y<<endl;
continue;
}
if(y - x == n)//如果[x,y]正好有n+1项
{
int mns = y - x;
int start = x;
while(start - mns > 0)
{
start -= mns;
}
for(int i = 0;i < n;i ++)
{
cout<<start + i * mns<<' ';
}
cout<<endl;
continue;
}
int tms = y - x;
for(int i = 1;i <= tms;i ++)
{
if(tms % i == 0)
{
if(tms / i + 1> n) continue;
int mns = tms / i,j = 0;
while(x + j * mns <= y) j ++; //计算[x,y]里面有多少项
j ++;
int res = n - j;//还剩多少项没有分配
int start = x;
while(start - mns > 0 && res != 0) start -= mns,res --;//尽量使第一项小
int r = start + (n - 1) * mns;
if(r < minr) minf = start,minr = r,amns = mns;
if(r == minr)
if(start < minf)
minf = start,minr = r,amns = mns;
}
}
for(int i = 0;i < n;i ++)
{
cout<<minf + i * amns<<' ';
}
cout<<endl;
}
}
或者可以在云剪贴板看(T5)