Codeforces 1838 A Blackboard List

该编程问题旨在从经过特定操作的数组中找出原始数组的一个元素。关键在于理解负数不会在操作中产生,且最大值或最小值可能是最初的数字。解决方案是排序后检查第一个元素是否为负数,然后输出最大或最小值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址

https://codeforces.com/problemset/problem/1838/A

题目抽象

数组 a a a 中有 2 2 2 个数字,然后任取数组 a a a 中的两个数字 a i , a j a_i, a_j ai,aj,将 ∣ a i − a j ∣ |a_i - a_j| aiaj 放入数组 a a a,重复 n − 2 n-2 n2 次后形成长度为 n n n 的数组
现在给你乱序后的数组 a a a,要求把最初的其中一个数字

数据范围
3 ≤ n ≤ 100 3\le n\le100 3n100
− 1 0 9 ≤ a i ≤ 1 0 9 -10^9\le a_i \le 10^9 109ai109

题目类型

思维

解题思路

我们观察到数字有负数,而后续往里添加的数字都是非负数,也就是负数不可能生成
所以,如果 a i a_i ai 是负数,那么一定是最初的数字
再来看所有 a i a_i ai 都是非负数的情况,根据 ∣ a i − a j ∣ ≤ max ⁡ ( a i , a j ) |a_i-a_j|\le \max(ai, aj) aiajmax(ai,aj),得到的新数一定是比原来的数要小的,所以最大的数一定是最初的数字

所以解法就非常简单了,最小的数字是负数,则输出最小数字,否则输出最大数字, O ( n ) O(n) O(n) 复杂度
由于 n n n 不大,直接排序 O ( n ⋅ log ⁡ n ) O(n \cdot \log n) O(nlogn),写起来更方便

代码

#include <bits/stdc++.h>
using namespace std;

int n;
int a[100];
void solve() {
  cin >> n;
  for (int i = 0; i < n; i ++) {
    cin >> a[i];
  }
  sort(a, a + n);
  if (a[0] >= 0) {
    cout << a[n - 1] << endl;
  } else {
    cout << a[0] << endl;
  }
}
int main() {
  int T; cin >> T; while (T--) solve();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值