为荣誉而拼搏少年 2024-06-14 20:44 采纳率: 36.8%
浏览 26

朋友数列123456

朋友数列

题目描述

小 K 喜欢数列。设数列 $a,b$ 的长度均为 $n$,$a_i$ 表示数列 $a$ 中第 $i(1 \le i \le n)$ 个数字,$b_i$ 表示数列 $b$ 中第 $i(1 \le i\le n)$ 个数字。

如果对于所有的 $1 \le i \le n$,$a_i+b_i$ 的值均相同,并且满足 $-10^9 \le a_i,b_i \le 10^9$,则小 K 称它们是一对朋友数列。

现在,小 K 随手写下了 $n$ 和数列 $a$,小 K 希望你能帮助小 K 找到数列 $a$ 的一个朋友数列。

输入格式

输入共两行。

输入的第一行为一个整数 $n$。
输入的第二行为 $n$ 个整数,第 $i$ 个数为 $a_i$。

输出格式

输出一行 $n$ 个整数,表示数列 $a$ 的一个朋友数列。

可能有多种符合题意的答案,你只需要输出任意一种即可。

样例 #1

样例输入 #1

5
1 2 3 4 5

样例输出 #1

5 4 3 2 1

提示

数据规模与约定

  • 对于 $20%$ 的测试数据,$n=1$;
  • 对于 $100%$ 的测试数据,$1 \le n \le 10^5$,$|a_i| \le 10^9$。
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-14 20:44
    关注

    引自免费微信小程序:皆我百晓生

    根据题目要求,我们需要找到一个数列b作为数列a的朋友数列,使得对于每一个位置i(1 <= i <= n),都有a[i] + b[i]的值相同。为了简化问题,我们可以设定这个共同的值为a[1] + b[1],这样我们只需要确保b[1]的值让a[1] + b[1]满足条件即可。然后,对于每一个i(2 <= i <= n),我们可以通过b[i] = (a[1] + b[1]) - a[i]计算出b[i]的值。

    下面是一个C++代码示例,用于解决这个问题:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        int n;
        cin >> n; // 输入数列a的长度
    
        vector<int> a(n); // 定义数列a
        for (int i = 0; i < n; ++i) {
            cin >> a[i]; // 输入数列a的元素
        }
    
        int commonSum = 2 * a[0]; // 设定共同的值为a[0]的两倍,这样可以确保b[0] = a[0]
        vector<int> b(n); // 定义数列b
        b[0] = a[0]; // 确保b[0] = a[0]
    
        // 计算数列b的其余元素
        for (int i = 1; i < n; ++i) {
            b[i] = commonSum - a[i];
        }
    
        // 输出数列b
        for (int i = 0; i < n; ++i) {
            cout << b[i] << " ";
        }
        cout << endl;
    
        return 0;
    }
    

    这段代码首先读取了数列的长度n和数列a的所有元素。然后它定义了一个新的数列b,并设定了b[0] = a[0],这意味着commonSum被设定为2 * a[0]。接下来,通过遍历a中的每个元素,计算相应的b[i]值,并将结果存储在b中。最后,程序输出数列b的所有元素,即为所求的朋友数列。

    这个算法的时间复杂度为O(n),因为它只遍历了一次数列ab。空间复杂度也为O(n),因为需要额外的空间来存储数列b。这个解法满足题目要求,并且可以处理题目中提到的所有数据范围。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 6月14日
  • 创建了问题 6月14日