首页 > 其他分享 >题解- 恢复数组

题解- 恢复数组

时间:2025-01-07 19:04:02浏览次数:11  
标签:10 20 int 题解 50 数组 恢复 等差数列

题目描述

有一个数组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,表示有T组测试数据。
接下来有T行,每行3个整数:n,x,y。

输出
共T行,每行n个整数。
样例输入 Copy
5
2 1 49
5 20 50
6 20 50
5 3 8
9 13 22
样例输出 Copy
1 49
10 20 30 40 50
20 26 32 38 44 50
3 8 13 18 23
1 4 7 10 13 16 19 22 25
提示
对于100%的数据满足:1≤T≤100,2≤n≤50,1≤x,y≤50。

题意

有一个数组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组数据,每组数据包含n,x,y三个数。

(给定条件补全数组的题目)

分析

1.数组中的每个数都大于0,且互不相同。

2 .y和x存在于数组中。

3 .数组是递增的等差数列。

我们可以求出x和y的差p,那么等差数列的差一定就是p的因数

又因为要求a[n]最小的,所以公差一定是p的最小因数

除此之外,x和y之间的数(包括x,y)的个数一定小于等于n

把握这三点就能求出答案

代码

#include<iostream>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        int maxx = 1e9;
        int ans;
        int n, x, y;
        cin >> n >> x >> y;
        int p = y - x;
        for (int i = 1; i <=p;i++)
        {
            if(p%i==0)
            {
                if(p/i<n)
                {
                    int u = n - p / i;
                    x = x - (u) * i;
                    int count = 0;
                    int j = 1;
                    while(1)
                    {
                        j++;
                        if(x + (j - 1) * i<=0)//只输出大于0的数
                        {
                            continue;
                        }
                        cout << x + (j - 1) * i << " ";
                        count++;
                        if(count==n)//输出n个停止即可
                        {
                            break;
                        }
                    }
                    break;
                }
            }
            continue;
        }
        cout << endl;
    }
    return 0;
}

标签:10,20,int,题解,50,数组,恢复,等差数列
From: https://blog.csdn.net/qq_73162098/article/details/144847678

相关文章

  • 海贼OJ #251. 士兵 题解 排序+中位数(数学思维题)
    题目链接:https://oj.haizeix.com/problem/251解题思路:最短总距离是所有点到中位数的距离之和。对\(y\):排序求中位数。对\(x\):对\(x\)排序,然后对排序后的\(x_i-i\)排序,然后求最短距离。对\(x_i-i\)进行处理,能保证最终的\(x_i\)各不一样且相邻。示例程序:#inclu......
  • React函数组件中与生命周期相关Hooks详解
    React函数组件及其钩子渲染流程是React框架中的核心概念之一。以下是对该流程的详细解析:一、React函数组件基础定义:React函数组件是一个接收props作为参数并返回React元素的函数。它们通常用于表示UI的一部分,并且不保留内部状态(除非使用React的Hooks)。......
  • 题解:P1541 [NOIP2010 提高组] 乌龟棋
    基础动态规划。这道题的题目条件显然满足阶段性和无后效性,那么有一个直观的思路就是把当前所处格子和四种卡片的使用次数作为状态。但是如果按照上面的想法,数组空间是无法开下的,所以我们稍微变一下思路,把四种卡片的使用数量作为状态,对于当前所处格子的话可以直接计算出来,这样数......
  • C语言指针数组
    1. 指针数组的定义指针数组是数组,其元素为指针。定义格式为 数据类型*数组名[数组大小] 。例如,定义一个能存放5个指向 int 类型数据的指针数组: cint*ptrArray[5];  2. 初始化-方式一:直接初始化 cintnum1=10,num2=20;int*ptrArray[]={&num......
  • P8037 [COCI2015-2016#7] Prokletnik 题解
    题意定义一个区间$l,r$为好的当且仅当最小值为$a_l$且最大值为$a_r$或最大值为$a_l$且最小值为$a_r$。我们先考虑最小值为$a_l$且最大值为$a_r$的,另一个我们翻转过来在搞一遍就好了。先考虑将询问离线按$r$排序,容易发现,对于每个右端点$r$对应的合法左端点是......
  • E. Beautiful Array(题解)
    原题链接:https://codeforces.com/problemset/problem/1986/E思路:排序,取模,思维关于操作:ai=ai+k;若要使a1+m1*k==a2+m2*k;则当a1,a2满足a1%k==a2%k,a1,a2可以满足a1+m1*k==a2+m2*k;并在需要(|a1-a2|)/k次操作。将a数组取模后,用vector分别储存,a1和a2相差越小,需要的次数越......
  • 题解:CF2043C Sums on Segments
    题意给你一个长度为\(n\)的数组\(a\),满足\(a\)中有且仅有一个不为\(1\)也不为\(-1\)的数(以下简称特殊的值),剩余的数都是\(1\)或\(-1\)。求所有可能的子区间的和的值(下文简称答案)。从小到大一次输出每一个值,每个值只输出一遍。题解首先,我们发现,如果把那个特殊的值考......
  • 题解:CF2057B Gorilla and the Exam
    CF2057BGorillaandtheExam思路不难发现其实每次操作就是把数组\(a\)内所有值为\(y\)的数都删除掉(\(y\)为数组\(a\)中的莫一个值)。所以我们需要把尽可能多的数都变成原来数组里出现次数最多的数(从出现数量最少的开始,这样能使得消失的数值种类最大化)。首先想到使用数组......
  • 题解:P11507 [ROIR 2017 Day 1] 计算器
    P11507[ROIR2017Day1]计算器思路简单的动态规划。\(dp_{i,j,k}\)表示使用了\(i\)次按钮A,\(j\)次按钮B和\(k\)次按钮C。转移式:\[\begin{cases}dp_{i+1,j,k}=\min(dp_{i+1,j,k},\lfloordp_{i,j,k}\div2\rfloor);\\dp_{i,j+1,k}=\min(dp_{i,j+1,k},\lfloo......
  • QOJ964. Excluded Min 题解
    QOJ原题链接简要题意设\(S\)为一个可重非负整数集合,假设\(x\)为\(S\)中的一个出现次数\(\ge2\)的元素,你可以将\(x\)改成\(x+1\)或\(x-1\)。定义\(f(S)\)表示对\(S\)进行上述操作任意次所能达到的最大\(\operatorname{mex}\)。给定一个长度为\(n\)的......